• (最详细)关于List和Set的区别与应用


    关于List与Set的区别

    List和Set都继承自Collection接口


    • List接口的实现类有三个:LinkedList、ArrayList、Vector。
    • Set接口的实现类有两个:HashSet(底层由HashMap实现)、LinkedHashSet。

    在List中,List.add()是基于数组的形式来添加元素的,因此在List中,元素存放是有序的,且可重复,并且支持for循环和迭代器遍历,因此List在查找元素效率较高,插入和删除元素效率较低。

    在Set中,Set.add()是基于HashMap实现的,通过Map.put来添加元素,因此在Set中元素不可重复(map-key不可重复),且元素存放位置是由该元素的hashCode来决定的,其位置是固定且无序的,Set遍历也只能使用迭代器,因为其无序,所以不能使用下标取值。

    在List和Set中,都有一个contains()方法来判断是否存在指定元素,但由于两者实现方式各不相同,因此两者该方法的效率都不一样。在List中的contains是对每一个元素都是用equals()来判断是否存在该值,但是在Set是基于HashMap实现的,其中的contains实际上是调用Map.ccontainsKey方法,先判断元素对应的hashcode只有有值,没有直接返回,有的话再用equals判断内容是否相等


    简单总结:与List相比,Set的contains()方法效率要高很多,如下示例

    1. public class Test {
    2. public static void main(String[] args) {
    3. List list = getListData();
    4. Set set = getSetData();
    5. long listStart = System.currentTimeMillis();
    6. if (list.contains("list1000000")) {
    7. System.out.println("list contains list1000000");
    8. }
    9. long listEnd = System.currentTimeMillis();
    10. System.out.println("list contains list1000000 time:" + (listEnd - listStart));
    11. long setStart = System.currentTimeMillis();
    12. if (set.contains("set1000000")) {
    13. System.out.println("set contains set1000000");
    14. }
    15. long setEnd = System.currentTimeMillis();
    16. System.out.println("set contains set1000000 time:" + (setEnd - setStart));
    17. }
    18. public static List getListData() {
    19. List list = new ArrayList<>();
    20. for (int i = 0; i <= 1000000; i++) {
    21. list.add("list" + i);
    22. }
    23. return list;
    24. }
    25. public static Set getSetData() {
    26. Set set = new HashSet<>();
    27. for (int i = 0; i <= 1000000; i++) {
    28. set.add("set" + i);
    29. }
    30. return set;
    31. }
    32. }

    输出结果:

  • 相关阅读:
    【Git】第五篇:基本操作(添加文件)
    关于亚马逊测评,你了解多少?
    Spring Cloud OpenFeign 开启 httpclient5
    编译安装openssl及安装完openssl后使用 ssh -V 查看依然是旧版openssl原因
    【数据结构---排序】很详细的哦
    Springboot中认证和授权的实现(使用jwt)
    基于PHP的汉服文化交流平台 毕业设计-附源码240903
    npm install 报错
    Java集合(二)
    赣菜出赣,2023中国江西国际餐饮产业博览会,餐饮新零售展
  • 原文地址:https://blog.csdn.net/weixin_42009068/article/details/137940117