最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年09月25日 10:36:04   作者:_Jason_PC_  
這篇文章主要介紹了java 較大數(shù)據(jù)量取差集,list.removeAll性能優(yōu)化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

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

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

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

List.removeAll效率低原因:

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

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

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

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

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

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

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

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

改進(jìn)代碼

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

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

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

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();
 }
 
 // 獲取兩個(gè)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();
  }
 }
 
 /**
  * @方法描述:獲取兩個(gè)ArrayList的差集
  * @param firstArrayList 第一個(gè)ArrayList
  * @param secondArrayList 第二個(gè)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;
 }
 
 /**
  * @方法描述:獲取兩個(gè)ArrayList的交集
  * @param firstArrayList 第一個(gè)ArrayList
  * @param secondArrayList 第二個(gè)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;
 }
 
 /**
  * @方法描述:獲取兩個(gè)ArrayList的去重并集
  * @param firstArrayList 第一個(gè)ArrayList
  * @param secondArrayList 第二個(gè)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)添加不成功的時(shí)候 說明firstSet中已經(jīng)存在該對(duì)象
   firstSet.add(id);
  }
  resultList = new ArrayList<String>(dawjidSet);
  return resultList;
 }
}

打印結(jié)果:

===================差集===================
aaa
ddd
===================交集===================
bbb
ccc
=================去重并集==================
aaa
bbb
ccc
ddd
eee

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

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

相關(guān)文章

  • 全面剖析java中的注解(Annotation)

    全面剖析java中的注解(Annotation)

    一個(gè)詞就可以描述注解,那就是元數(shù)據(jù),即一種描述數(shù)據(jù)的數(shù)據(jù)。所以,可以說注解就是源代碼的元數(shù)據(jù)。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • ConditionalOnProperty配置swagger不生效問題及解決

    ConditionalOnProperty配置swagger不生效問題及解決

    這篇文章主要介紹了ConditionalOnProperty配置swagger不生效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題

    springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題

    這篇文章主要介紹了springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題,需要的朋友可以參考下
    2017-06-06
  • java并發(fā)容器CopyOnWriteArrayList實(shí)現(xiàn)原理及源碼分析

    java并發(fā)容器CopyOnWriteArrayList實(shí)現(xiàn)原理及源碼分析

    這篇文章主要為大家詳細(xì)介紹了java并發(fā)容器CopyOnWriteArrayList實(shí)現(xiàn)原理及源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java數(shù)組傳遞及可變參數(shù)操作實(shí)例詳解

    Java數(shù)組傳遞及可變參數(shù)操作實(shí)例詳解

    這篇文章主要介紹了Java數(shù)組傳遞及可變參數(shù)操作,結(jié)合實(shí)例形式詳細(xì)分析了java數(shù)組參數(shù)傳遞與可變參數(shù)相關(guān)使用技巧,需要的朋友可以參考下
    2019-09-09
  • 如何自動(dòng)生成Mybatis的Mapper文件詳解

    如何自動(dòng)生成Mybatis的Mapper文件詳解

    這篇文章主要給大家介紹了關(guān)于如何自動(dòng)生成Mybatis的Mapper文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • IntelliJ IDEA2020.3詳細(xì)安裝教程

    IntelliJ IDEA2020.3詳細(xì)安裝教程

    這篇文章主要介紹了IntelliJ IDEA2020.3詳細(xì)安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java實(shí)現(xiàn)簡(jiǎn)單文件過濾器功能

    Java實(shí)現(xiàn)簡(jiǎn)單文件過濾器功能

    下面小編就為大家分享一篇Java實(shí)現(xiàn)簡(jiǎn)單文件過濾器功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • Mybatis環(huán)境搭建及文件配置過程解析

    Mybatis環(huán)境搭建及文件配置過程解析

    這篇文章主要介紹了Mybatis環(huán)境搭建及文件配置過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java以編程方式實(shí)現(xiàn)JAR文件的創(chuàng)建

    Java以編程方式實(shí)現(xiàn)JAR文件的創(chuàng)建

    在這篇文章中,我們將為大家詳細(xì)介紹一下利用Java語言以編程方式創(chuàng)建jar文件的過程。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-07-07

最新評(píng)論

乐业县| 南涧| 那曲县| 赤水市| 盐池县| 扶余县| 高青县| 蒙城县| 五河县| 平度市| 苍南县| 汪清县| 大厂| 富民县| 长垣县| 太湖县| 肇源县| 香港| 高雄县| 澄迈县| 东至县| 基隆市| 琼海市| 建平县| 望谟县| 开封县| 同心县| 平阴县| 榆中县| 牡丹江市| 九台市| 安化县| 阿合奇县| 普格县| 台南县| 石狮市| 横山县| 凌海市| 德兴市| 临高县| 景洪市|