色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

java 較大數(shù)據(jù)量取差集,list.removeAll性能優(yōu)化詳解

瀏覽:27日期:2022-08-23 18:40:13

今天在優(yōu)化項目中的考勤同步功能時遇到將考勤機(jī)中的數(shù)據(jù)同步到數(shù)據(jù)庫,

兩邊都是幾萬條數(shù)據(jù)的樣子,老代碼的做法差不多半個小時,優(yōu)化后我本機(jī)差不多40秒,服務(wù)器速度會更加理想。

兩個數(shù)據(jù)集取差集首先想到的方法便是List.removeAll方法,但是實驗發(fā)現(xiàn)jdk自帶的List.removeAll效率很低

List.removeAll效率低原因:

List.removeAll效率低和list集合本身的特點有關(guān) :

List底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢

1.List.contains()效率沒有hashset高

arrayList.removeAll底層是for循化調(diào)用contains方法。arrayList雖然用get(index)方法查詢效率高,但是若用contains方法查詢對象元素,Set集合應(yīng)該比List效率要高。

因為hashset的contains方法其實是先調(diào)用每個元素的hashCode()方法來返回哈希碼,如果哈希碼的值相等的情況下再調(diào)用equals(obj)方法去判斷是否相等,只有在這兩個方法所返回的值都相等的情況下,才判定這個HashSet包含某個元素,而list直接調(diào)用equals(obj)方法.所以hashset效率更高。

2.arrayList.remove()效率沒有l(wèi)inkedList刪除效率高

arrayList底層采用數(shù)組每刪除一下元素數(shù)據(jù)后面的元素都要往前移動效率低消耗的資源也大,linkedList鏈表刪除元素只要改變前后節(jié)點的位置信息

3.采用Iterator迭代器,這種方式我們僅需要對iterator進(jìn)行循環(huán),然后對需要刪除的元素執(zhí)行iterator.remove(iterator.next()),而無需關(guān)注下標(biāo)的問題

改進(jìn)代碼

LinkedList linkedList= new LinkedList(src);//大集合用linkedlistHashSet hashSet= new HashSet(oth);//小集合用hashsetIterator iter = linkedList.iterator();//采用Iterator迭代器進(jìn)行數(shù)據(jù)的操作while(iter.hasNext()){if(hashSet.contains(iter.next())){iter.remove();}}

補(bǔ)充知識:JAVA獲取兩個數(shù)據(jù)量較大的ArrayList的交集、差集以及并集

測試說明:獲取firstArrayList和secondArrayList的交集、差集以及并集。實際測試中firstArrayList數(shù)據(jù)量190000,secondArrayList數(shù)據(jù)量170000.效率比較高。此處只列出少量數(shù)據(jù)。測試代碼如下:

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的差集、交集、去重并集(數(shù)據(jù)量大小不限制) 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迭代器進(jìn)行數(shù)據(jù)的操作 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迭代器進(jìn)行數(shù)據(jù)的操作 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) { // 當(dāng)添加不成功的時候 說明firstSet中已經(jīng)存在該對象 firstSet.add(id); } resultList = new ArrayList<String>(dawjidSet); return resultList; }}

打印結(jié)果:

===================差集===================aaaddd===================交集===================bbbccc=================去重并集==================aaabbbcccdddeee

說明,取差集指的是取firstArrayList中存在但secondArrayList中不存在的數(shù)據(jù)集

以上這篇java 較大數(shù)據(jù)量取差集,list.removeAll性能優(yōu)化詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
主站蜘蛛池模板: 91久久在线 | 国产成人在线观看免费网站 | 亚洲毛片免费看 | 日韩一级片免费看 | 精品欧美成人bd高清在线观看 | 99精品久久精品一区二区 | 美女张开腿给男人桶 | 欧美精品日日鲁夜夜添 | 国产在线一区二区三区四区 | 久久视频在线播放视频99re6 | 99re热这里只有精品视频 | 久久久久久中文字幕 | www.乱 | 久久香蕉国产精品一区二区三 | 成人黄色免费看 | 久草热草 | 成熟女人免费一级毛片 | 色秀视频在线观看88品善网 | 一级毛片视频在线 | 国产欧美va欧美va香蕉在线 | 久久精品一区二区国产 | 国产精品久久久久久吹潮 | 在线步兵区| 久久久99精品免费观看 | 欧美一级特黄aaaaaa在线看首页 | 日韩欧美亚洲每的更新在线 | 亚洲人成在线观看 | 国产特黄一级一片免费 | 亚洲福利视频精选在线视频 | 中文字幕曰韩一区二区不卡 | 久久亚洲精品无码观看不卡 | 色综合亚洲七七久久桃花影院 | 国产网站91| 亚洲国产成人在线 | 一级特级aaaa毛片免费观看 | 日本欧美在线视频 | 国产67194| 五月色一区二区亚洲小说 | 中文字幕一区二区在线视频 | 日韩三级视频 | 精品国产日韩亚洲一区二区 |