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()方法想必,底層實現不同,也導致效率差異明顯。