Java求兩集合中元素交集的四種方法對比分析
最近在做項目的時候有用到對兩個集合中的元素進行對比求其交集的情況,因為涉及到的數(shù)據(jù)量比較大,所以在進行求兩個集合中元素交集的時候,就應(yīng)該考慮到程序運行的時間消耗等問題,
所以寫了四種求集合元素交集的方法 今天這篇文章主要是來記錄對比一下,這四種方法使用起來的效率問題,
方法一,求兩個集合的交集【普通for循環(huán)】
這種方法是最普通的進行for循環(huán)比較的方法。利用集合的contains方法,來對比第二個集合中是否存在相同的元素的方法,同時將交集結(jié)果返回。
代碼示例如下:
/** * 方法1,求兩個集合的交集 * * @param arr1 * @param arr2 * @return */ public List<Object> intersectionForList_1(List<Object> arr1, List<Object> arr2) { long startTime = System.currentTimeMillis(); List<Object> result = new ArrayList<>(); for (Object arr : arr1) { if (arr2.contains(arr)) { result.add(arr); } } long endTime = System.currentTimeMillis(); log.info("intersectionForList_1:" + (endTime - startTime)); return result; }
方法二,求兩個集合交集,(迭代器)
這種方法使用的是list集合的迭代器的方法,其實原理和for是一樣的,方法的核心也和for循環(huán)是一樣的,只是外層循環(huán)的方法不一樣,所以它和上面第一種方法的效果是一樣的。
代碼示例如下:
/** * 方法2,求兩個集合交集,(迭代器) * * @param arr1 * @param arr2 * @return */ public List<Object> intersectionForList_2(List<Object> arr1, List<Object> arr2) { long startTime = System.currentTimeMillis(); List<Object> resultList = new ArrayList<>(); List<Object> maxList; List<Object> minList; if (arr1.size()>arr2.size()){ maxList = arr1; minList = arr2; }else { maxList = arr2; minList = arr1; } Iterator<Object> iterator = maxList.iterator(); while (iterator.hasNext()){ Object next = iterator.next(); if (minList.contains(next)){ resultList.add(next); } } long endTime = System.currentTimeMillis(); log.info("intersectionForList_2:" + (endTime - startTime)); return resultList; }
方法三,求兩個集合交集,(map)
這種方法使用的是map的特性,首先將list集合中的元素依次存入一個map中去,然后再以map的get方法來判斷是否存在這樣的元素。
這種方法的效率最高,在10萬條數(shù)據(jù)的測試下,這種方法耗時僅僅在十幾毫秒,而其他方法在將近一百多毫秒。
在百萬條數(shù)據(jù)進行對比處理的時候,使用map特性的方法時間消耗大概在40毫秒左右,但是其他方法要將近10秒鐘,
所以在對于大量數(shù)據(jù)的處理過程中,還是非常建議使用這種方法的。
代碼示例如下:
/** * 方法3,求兩個集合交集,(map) * * @param arr1 * @param arr2 * @return */ public List<Object> intersectionForList_3(List<Object> arr1, List<Object> arr2) { long startTime = System.currentTimeMillis(); List<Object> resultList = new ArrayList<>(); Map<String,Object> map = new HashMap<>(); arr1.forEach(a1->{ map.put(a1+"",a1); }); arr2.forEach(a2->{ Object obj = map.get(a2 + ""); if (obj!=null){ resultList.add(obj); } }); long endTime = System.currentTimeMillis(); log.info("intersectionForList_3:" + (endTime-startTime)); return resultList; }
方法四,求兩個集合交集,(forEasy)
這種方法使用的是集合的foreasy特性和Java流的特性,使用這種方法可以遍歷其中的一個集合,然后再使用contains方法來判斷另一個集合中是否存在該集合元素,這種方法的使用效率要優(yōu)于第一種和第二種方法。
代碼示例如下:
/** * 方法4,求兩個集合交集,(forEasy) * @param arr1 * @param arr2 * @return */ public List<Object> intersectionForList_4(List<Object> arr1, List<Object> arr2){ long startTime = System.currentTimeMillis(); List<Object> resultList = new ArrayList<>(); arr1.stream().forEach(a1->{ if (arr2.contains(a1)){ resultList.add(a1); } }); long endTime = System.currentTimeMillis(); log.info("intersectionForList_4:" + (endTime-startTime)); return resultList; }
方法總結(jié)
總結(jié)一下以上四種求集合中元素交集的方法,按照在處理大量數(shù)據(jù)的效率來看,使用map集合的特性的方法效率最高,之后是使用Java流的方法,其次是使用for循環(huán)和迭代器的方法,所以在正常情況下,還是推薦使用map的特性來進行集合中元素的對比分析和求交集的。
到此這篇關(guān)于Java求兩集合中元素交集的四種方法對比總結(jié)的文章就介紹到這了,更多相關(guān)java求兩集合中元素交集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)批量下載(打包成zip)的實現(xiàn)
這篇文章主要介紹了Java實現(xiàn)批量下載(打包成zip)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Schedule定時任務(wù)在分布式產(chǎn)生的問題詳解
這篇文章主要介紹了Schedule定時任務(wù)在分布式產(chǎn)生的問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10SpringSecurity集成第三方登錄過程詳解(最新推薦)
在ThirdAuthenticationFilter 類的attemptAuthentication()方法中,我們通過authType類型,然后創(chuàng)建對應(yīng)的Authentication實現(xiàn)來實現(xiàn)不同方式的登錄,下面給大家分享SpringSecurity集成第三方登錄過程,感興趣的朋友一起看看吧2024-05-05SpringBoot整合Mybatis?LocalDateTime?映射失效的解決
這篇文章主要介紹了SpringBoot整合Mybatis?LocalDateTime?映射失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01用Maven插件生成Mybatis代碼的實現(xiàn)方法
本文主要介紹 Maven插件生成Mybatis代碼,現(xiàn)在做開發(fā)的朋友有好多用Maven 來管理代碼,這里給大家舉個例子,有需要的同學(xué)可以看下2016-07-07mybatisplus如何在xml的連表查詢中使用queryWrapper
這篇文章主要介紹了mybatisplus如何在xml的連表查詢中使用queryWrapper,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01