点击上方“小罗技术笔记”,关注公众号
第一时间送达实用干货
今天在项目中使用List.contain排除参数时一个同事告诉我不要用List的如果数据多了会很慢的。看了一下资料都说contains方法list效率比set低,由于平时都是用list也没有什么问题啊!就实验操作看一下。
准备数据代码:
List<Student> list = new ArrayList<Student>();
Set<Student> set = new HashSet<Student>();
Student s = null;
for(int i = 0; i <= 100000; i++){
s = new Student("name"+i,"addr"+i);
list.add(s);
set.add(s);
}
查询第一个对象:
long
start = System.currentTimeMillis();
Student
stu = new Student("name0","addr0");
System
.out.println(list.contains(stu));
long end = System.currentTimeMillis();
System
.out.println("查询对象 "+stu.toString()+"\n共耗费时间:"
+(end-start)+ "毫秒");
使用ArrayList查询结果结果:

使用HashSet查询结果:

查询第一个对象太简单了,它们都几乎不用花时间...
查询靠后的对象:
long
start = System.currentTimeMillis();
Student
stu = new Student("name100000","addr100000");
System
.out.println(set.contains(stu));
long
end = System.currentTimeMillis();
System.out.println("查询对象 "+stu.toString()+"\n共耗费时间:"
+(end-start)+ "毫秒");
使用ArrayList查询结果结果:

使用HashSet查询结果:

果然HashSet快一些。。。
通过多次调用contains方法分别查询开头到结尾所有对象:
long
start = System.currentTimeMillis();
for(int i = 0; i<= 100000; i++){
s = new Student("name"+i,"addr"+i);
System.out.println(i+"__"+list.contains(s));
}
long
end = System.currentTimeMillis();
System
.out.println("查询10000个对象 \n共耗费时间:"+(end-start)+ "毫秒");
使用ArrayList查询结果结果:

使用HashSet查询结果:

耗时前者是后者的167.46倍(打印代码中把100000写成10000了,但是不影响结果)
查阅资料:
Set的 contains()方法 实现的复杂度是O(1)、
List的 contains()方法 实现的复杂度是O(n)
List特点:元素有放入顺序,元素可重复 ,
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,
但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
附上二者contains()方法的区别对比:
1、HashSet的contains返回true,当且仅当equals返回true,并且hashCode返回相等的值 ;
Set除了比较equals,还比较hashCode
2、list.contains(o),系统会对list中的每个元素e调用o.equals(e),方法,加入list中
有n个元素,那么会调用n次o.equals(e),只要有一次o.equals(e)返回了true,那么
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。
详细可以看《算法》第四版

长按二维码关注
点个在看再走呗!




