百萬數據量List集合高效快速過濾去重篩選

1.序言

前段時間,接到一個需求。需要將微信公衆號的粉絲批量分組。當時需要分組的粉絲用戶量達到250W左右,但通過和我們的業務數據庫中篩選出來的不合格用戶粉絲,需要從250W粉絲中過濾去重。不合格的粉絲數有80W條左右,也就是最終需要篩選出需要分組的粉絲數爲170W左右。如此一下,兩個大數據集合對比篩選就需要考慮效率問題了!

 

2.過程

①一開始嘗試了一下雙重for循環大法,那結果,酸爽無比。程序直接把CPU餵飽了。。。。如此肯定是不可取的。

②使用Iterator迭代器,通過單循,並使用list的contains方法,來篩選。代碼如下:

Iterator fensiIterator = fensiList.iterator();
String temp = null;
while (fensiIterator.hasNext()){
	temp = fensiIterator.next().toString();
	if(openIds.contains(temp)){
		fensiIterator.remove();
	}
}

效率也很差,但比第一種稍微好一丟丟

③加強版來啦(推薦)!!!!先上代碼:

//250W數據list集合轉換成set集合
HashSet fensiSet = new HashSet(fensiList);
//80W從數據庫篩選出來不合符條件,需要過濾掉的用戶list集合
HashSet removeSet = new HashSet(openIds);
//去重操作
fensiSet.removeAll(removeSet);
//清空原有list,並裝入過濾後的數據set集合
fensiList.clear();
fensiList.addAll(fensiSet);

已經加上了註釋,大佬們,應該可以一目瞭然吧!

咱們來分析一下,爲啥set如此之快!查貼發現,原來set的HashSet.contains()方法,底層是通過HashMap來實現的。而HashMap的查找速度是很快的。雖然list也有removeAll()方法,但是與set的removeAll()方法想必,底層實現不同,也導致效率差異明顯。

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