您好,登錄后才能下訂單哦!
java 較大數據量取差集如何是list.removeAll優化性能?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
List.removeAll效率低原因:
List.removeAll效率低和list集合本身的特點有關 :
List底層數據結構是數組,查詢快,增刪慢
1.List.contains()效率沒有hashset高
arrayList.removeAll底層是for循化調用contains方法。arrayList雖然用get(index)方法查詢效率高,但是若用contains方法查詢對象元素,Set集合應該比List效率要高。
因為hashset的contains方法其實是先調用每個元素的hashCode()方法來返回哈希碼,如果哈希碼的值相等的情況下再調用equals(obj)方法去判斷是否相等,只有在這兩個方法所返回的值都相等的情況下,才判定這個HashSet包含某個元素,而list直接調用equals(obj)方法.所以hashset效率更高。
2.arrayList.remove()效率沒有linkedList刪除效率高
arrayList底層采用數組每刪除一下元素數據后面的元素都要往前移動效率低消耗的資源也大,linkedList鏈表刪除元素只要改變前后節點的位置信息
3.采用Iterator迭代器,這種方式我們僅需要對iterator進行循環,然后對需要刪除的元素執行iterator.remove(iterator.next()),而無需關注下標的問題
改進代碼
LinkedList linkedList= new LinkedList(src);//大集合用linkedlist HashSet hashSet= new HashSet(oth);//小集合用hashset Iterator iter = linkedList.iterator();//采用Iterator迭代器進行數據的操作 while(iter.hasNext()){ if(hashSet.contains(iter.next())){ iter.remove(); } }
補充知識:JAVA獲取兩個數據量較大的ArrayList的交集、差集以及并集
測試說明:獲取firstArrayList和secondArrayList的交集、差集以及并集。實際測試中firstArrayList數據量190000,secondArrayList數據量170000.效率比較高。此處只列出少量數據。測試代碼如下:
import java.util.Set; import java.util.List; import java.util.HashSet; import java.util.TreeSet; import java.util.Iterator; import java.util.ArrayList; import java.util.LinkedList; public class getSet { public static void main(String args[]) { getList(); } // 獲取兩個ArrayList的差集、交集、去重并集(數據量大小不限制) private static void getList() { List<String> firstArrayList = new ArrayList<String>(); List<String> secondArrayList = new ArrayList<String>(); List<String> defectList = new ArrayList<String>();//差集List List<String> collectionList = new ArrayList<String>();//交集List List<String> unionList = new ArrayList<String>();//去重并集List try { firstArrayList.add("aaa"); firstArrayList.add("bbb"); firstArrayList.add("ccc"); firstArrayList.add("ddd"); secondArrayList.add("bbb"); secondArrayList.add("ccc"); secondArrayList.add("eee"); // 獲取差集 defectList = receiveDefectList(firstArrayList, secondArrayList); Iterator<String> defectIterator = defectList.iterator(); System.out.println("===================差集==================="); while(defectIterator.hasNext()) { System.out.println(defectIterator.next()); } // 獲取交集 collectionList = receiveCollectionList(firstArrayList, secondArrayList); Iterator<String> collectionIterator = collectionList.iterator(); System.out.println("===================交集==================="); while(collectionIterator.hasNext()) { System.out.println(collectionIterator.next()); } // 獲取去重并集 unionList = receiveUnionList(firstArrayList, secondArrayList); Iterator<String> unionIterator = unionList.iterator(); System.out.println("===================去重并集==================="); while(unionIterator.hasNext()) { System.out.println(unionIterator.next()); } }catch(Exception e) { e.printStackTrace(); } } /** * @方法描述:獲取兩個ArrayList的差集 * @param firstArrayList 第一個ArrayList * @param secondArrayList 第二個ArrayList * @return resultList 差集ArrayList */ public static List<String> receiveDefectList(List<String> firstArrayList, List<String> secondArrayList) { List<String> resultList = new ArrayList<String>(); LinkedList<String> result = new LinkedList<String>(firstArrayList);// 大集合用linkedlist HashSet<String> othHash = new HashSet<String>(secondArrayList);// 小集合用hashset Iterator<String> iter = result.iterator();// 采用Iterator迭代器進行數據的操作 while(iter.hasNext()){ if(othHash.contains(iter.next())){ iter.remove(); } } resultList = new ArrayList<String>(result); return resultList; } /** * @方法描述:獲取兩個ArrayList的交集 * @param firstArrayList 第一個ArrayList * @param secondArrayList 第二個ArrayList * @return resultList 交集ArrayList */ public static List<String> receiveCollectionList(List<String> firstArrayList, List<String> secondArrayList) { List<String> resultList = new ArrayList<String>(); LinkedList<String> result = new LinkedList<String>(firstArrayList);// 大集合用linkedlist HashSet<String> othHash = new HashSet<String>(secondArrayList);// 小集合用hashset Iterator<String> iter = result.iterator();// 采用Iterator迭代器進行數據的操作 while(iter.hasNext()) { if(!othHash.contains(iter.next())) { iter.remove(); } } resultList = new ArrayList<String>(result); return resultList; } /** * @方法描述:獲取兩個ArrayList的去重并集 * @param firstArrayList 第一個ArrayList * @param secondArrayList 第二個ArrayList * @return resultList 去重并集ArrayList */ public static List<String> receiveUnionList(List<String> firstArrayList, List<String> secondArrayList) { List<String> resultList = new ArrayList<String>(); Set<String> firstSet = new TreeSet<String>(firstArrayList); for(String id : secondArrayList) { // 當添加不成功的時候 說明firstSet中已經存在該對象 firstSet.add(id); } resultList = new ArrayList<String>(dawjidSet); return resultList; } }
打印結果:
===================差集=================== aaa ddd ===================交集=================== bbb ccc =================去重并集================== aaa bbb ccc ddd eee
說明,取差集指的是取firstArrayList中存在但secondArrayList中不存在的數據集
關于java 較大數據量取差集如何是list.removeAll優化性能問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。