JAVA 集合框架優化之list.removeAll大資料量優化
阿新 • • 發佈:2019-01-23
今天在公司做專案需要求兩個集合的補集,考慮到collection類有removeAll方法,決定採用這種方式;結果程式一直卡在那兒不動了;
資料量是兩個集合的資料差不多都有60萬,直接導致程式處於假死狀態(程式當然是還在執行);
出現問題始終要解決的,我又給程式修改為先用retainAll求交集,然後再removeAll的方式,效果不明顯(事實是也假死了),我的應用場景還要求實時性,沒辦法只能從其他方面找尋思路了;
- 既然removeAll執行效率低,我就改成迴圈remove試試看,結果是效率上有了一定的提升(在此需要注意list要倒序迴圈,因為remove是刪除了下標,刪除了之後後邊的元素會前移),但是效果仍然不明顯;
- 另外一種是採用Iterator迭代器,這種方式我們僅需要對iterator進行迴圈,然後對需要刪除的元素執行iterator.remove(iterator.next()),而無需關注下標的問題;
結合list的特性,LinkedList插入更新效率高,ArrayList查詢效率高,對這裡的使用場景我們顯然需要將集合轉換成LinkedList
以下是我對list的優化工具類,執行結果較其他方法不是一個數量級的提升!,程式碼如下
package com.wyg.collection; import java.util.List; import java.util.LinkedList; import java.util.HashSet; import java.util.Iterator; public class RemoveAllProfile{ public static List removeAll(List src,List oth){ LinkedList result = new LinkedList(src);//大集合用linkedlist HashSet othHash = new HashSet(oth);//小集合用hashset Iterator iter = result.iterator();//採用Iterator迭代器進行資料的操作 while(iter.hasNext()){ if(othHash.contains(iter.next())){ iter.remove(); } } return result; } }