list去重的兩種方法大比拼

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章