有兩個存儲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的原理是對鏈表進行遍歷比較來去重的,所以效率不高。