暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

为什么集合contains方法建议使用Set而不是List?

小罗技术笔记 2020-03-14
1435

点击上方“小罗技术笔记”,关注公众号

第一时间送达实用干货


今天在项目中使用List.contain排除参数时一个同事告诉我不要用List的如果数据多了会很慢的。看了一下资料都说contains方法list效率比set低,由于平时都是用list也没有什么问题啊!就实验操作看一下。

准备数据代码:

  1. List<Student> list = new ArrayList<Student>();

  2. Set<Student> set = new HashSet<Student>();

  3.  Student s = null;

    for(int i = 0; i <= 100000; i++){

  4.      s = new Student("name"+i,"addr"+i);

  5.      list.add(s);

         set.add(s);

  6. }

查询第一个对象:

  1. long
    start = System.currentTimeMillis();

  2. Student
    stu = new Student("name0","addr0");

  3. System
    .out.println(list.contains(stu));

  4. long end = System.currentTimeMillis();

  5. System
    .out.println("查询对象 "+stu.toString()+"\n共耗费时间:"

  6. +(end-start)+ "毫秒");

使用ArrayList查询结果结果:

使用HashSet查询结果:

查询第一个对象太简单了,它们都几乎不用花时间...

查询靠后的对象:

  1. long
    start = System.currentTimeMillis();

  2. Student
    stu = new Student("name100000","addr100000");

  3. System
    .out.println(set.contains(stu));

  4. long
    end = System.currentTimeMillis();


  5. System.out.println("查询对象 "+stu.toString()+"\n共耗费时间:"

  6. +(end-start)+ "毫秒");

使用ArrayList查询结果结果:

使用HashSet查询结果:

果然HashSet快一些。。。

通过多次调用contains方法分别查询开头到结尾所有对象:

  1. long
    start = System.currentTimeMillis();

    for(int i = 0; i<= 100000; i++){

  2.    s = new Student("name"+i,"addr"+i);

  3.    System.out.println(i+"__"+list.contains(s));


  4. }

  5. long
    end = System.currentTimeMillis();

  6. System
    .out.println("查询10000个对象 \n共耗费时间:"+(end-start)+ "毫秒");

使用ArrayList查询结果结果:

使用HashSet查询结果:

耗时前者是后者的167.46倍(打印代码中把100000写成10000了,但是不影响结果)

查阅资料:

  1. Set   contains()方法    实现的复杂度是O(1)、

  2. List    contains()方法    实现的复杂度是O(n)

  3. List特点:元素有放入顺序,元素可重复

  4. Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,

  5. 但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)

附上二者contains()方法的区别对比:

  1. 1HashSetcontains返回true,当且仅当equals返回true,并且hashCode返回相等的值

  2. Set除了比较equals,还比较hashCode


  3. 2list.contains(o),系统会对list中的每个元素e调用o.equals(e),方法,加入list

  4. n个元素,那么会调用no.equals(e),只要有一次o.equals(e)返回了true,那么

  5. list.contains(o)返回true



算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)

简单理解:就是变量为n的时候,算法需要对变量操作次数的量级。

简单解释:

简单说O(n²)表示当n很大的时候,复杂度约等于Cn²,C是某个常数,简单说就是当n足够大的时候,n的线性增长,复杂度将沿平方增长。

O(n)也是差不多的意思,也就是说n很大的时候复杂度约等于Cn,C是某个常数。

O(1)就是说n很大的时候,复杂度基本就不增长了,基本就是个常量C。

详细可以看《算法》第四版


长按二维码关注

点个在看再走呗!

文章转载自小罗技术笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论