有两个存储10000数据的list(LinkedList A和 LinkedList B)要去重,有两种方法:
方法一:
把两个list都放到一个HashSet里面,然后for循环转化回LinkedList。
方法二:
A.removeAll(B);
A.addAll(B);
上面两种方法,哪种效率更好呢?下面我们来让两种方法做一个大比拼:
public class ListRemovePKSet {
public static void main(String[] args) {
Long setCost=setFor();
Long listCost=listRemove();
if(setCost<listCost){
System.out.println("set大获全胜");
}else if(setCost<listCost){
System.out.println("list大获全胜");
}else{
System.out.println("set和list势均力敌");
}
}
public static Long setFor(){
List<Long> ids = new LinkedList<Long>();
List<Long> listIds1 = new LinkedList<Long>();
List<Long> listIds2 = new LinkedList<Long>();
Long num=1L;
for(int i=0;i<10000;i++){
listIds1.add(num++);
}
listIds1.add(1000001L);
num=1L;
Long begin=System.currentTimeMillis();
Set<Long> set = new HashSet<Long>();
set.clear();
set.addAll( listIds1 );
set.addAll( listIds2 );
for (Long brandId : set) {
ids.add(brandId);
}
Long cost=System.currentTimeMillis()-begin;
System.out.println("set花费时间:"+cost);
System.out.println("list长度:"+ids.size());
return cost;
}
public static Long listRemove(){
List<Long> listIds1 = new LinkedList<Long>();
List<Long> listIds2 = new LinkedList<Long>();
Long num=1L;
for(int i=0;i<10000;i++){
listIds1.add(num++);
}
listIds1.add(1000001L);
num=1L;
for(int i=0;i<10000;i++){
listIds2.add(num++);
}
Long begin=System.currentTimeMillis();
listIds1.removeAll(listIds2);
listIds1.addAll(listIds2);
Long cost=System.currentTimeMillis()-begin;
System.out.println("listRemove花费时间:"+cost);
System.out.println("list长度:"+listIds1.size());
return cost;
}
}
结果:
set花费时间:5
list长度:10001
listRemove花费时间:298
list长度:10001
set大获全胜
由此可见,用set去重的效率高很多。
其实这是因为list.RemoveAll的原理是对链表进行遍历比较来去重的,所以效率不高。