Java中5種List的去重方法及它們的效率對比,你用對了嗎?
來源:blog.csdn.net/qq3434569/article/details/100520524
01、使用兩個(gè)for循環(huán)實(shí)現(xiàn)List去重(有序)
????/**使用兩個(gè)for循環(huán)實(shí)現(xiàn)List去重(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationBy2For(List?list) ?{
????????for?(int?i=0;i????????{
????????????for?(int?j=i+1;j????????????{
????????????????if(list.get(i).equals(list.get(j))){
????????????????????list.remove(j);
????????????????}
????????????}
????????}
????????return?list;
????}
02、使用List集合contains方法循環(huán)遍歷(有序)
????/**使用List集合contains方法循環(huán)遍歷(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByContains(List?list) ?{
????????List?newList?=new?ArrayList<>();
????????for?(int?i=0;i????????{
????????????boolean?isContains?=newList.contains(list.get(i));
????????????if(!isContains){
????????????????newList.add(list.get(i));
????????????}
????????}
????????list.clear();
????????list.addAll(newList);
????????return?list;
????}
03、使用HashSet實(shí)現(xiàn)List去重(無序)
????/**使用HashSet實(shí)現(xiàn)List去重(無序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByHashSet(List?list) ?{
????????HashSet?set?=?new?HashSet(list);
????????//把List集合所有元素清空
????????list.clear();
????????//把HashSet對象添加至List集合
????????list.addAll(set);
????????return?list;
????}
04、使用TreeSet實(shí)現(xiàn)List去重(有序)
????/**使用TreeSet實(shí)現(xiàn)List去重(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByTreeSet(List?list) ?{
????????TreeSet?set?=?new?TreeSet(list);
????????//把List集合所有元素清空
????????list.clear();
????????//把HashSet對象添加至List集合
????????list.addAll(set);
????????return?list;
????}
05、使用java8新特性stream實(shí)現(xiàn)List去重(有序)
????/**使用java8新特性stream實(shí)現(xiàn)List去重(有序)
?????*
?????*?@param?list
?????*?*/
????public?static?List?removeDuplicationByStream(List?list) ?{
????????List?newList?=?list.stream().distinct().collect(Collectors.toList());
????????return?newList;
????}
效率測試代碼
????public?static?void?main(String?args[])?{
????????List?list1?=?new?ArrayList<>();
????????List?list2?=?new?ArrayList<>();
????????List?list3?=?new?ArrayList<>();
????????List?list4?=?new?ArrayList<>();
????????List?list5?=?new?ArrayList<>();
????????Random?random?=new?Random();
????????for?(int?i?=?0;?i?100000;?i++)?{
????????????int?value?=random.nextInt(500);
????????????list1.add(value);
????????????list2.add(value);
????????????list3.add(value);
????????????list4.add(value);
????????????list5.add(value);
????????}
????????long?startTime?;
????????long?endTime;
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByHashSet(list1);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用HashSet實(shí)現(xiàn)List去重時(shí)間:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByTreeSet(list2);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用TreeSet實(shí)現(xiàn)List去重時(shí)間:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByStream(list3);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用java8新特性stream實(shí)現(xiàn)List去重:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationBy2For(list4);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用兩個(gè)for循環(huán)實(shí)現(xiàn)List去重:"+(endTime-startTime)+"毫秒");
????????startTime?=?System.currentTimeMillis();
????????removeDuplicationByContains(list5);
????????endTime?=?System.currentTimeMillis();
????????System.out.println("使用List集合contains方法循環(huán)遍歷:"+(endTime-startTime)+"毫秒");
?
????}
結(jié)果:
使用HashSet實(shí)現(xiàn)List去重時(shí)間:40毫秒 使用TreeSet實(shí)現(xiàn)List去重時(shí)間:36毫秒 使用java8新特性stream實(shí)現(xiàn)List去重:78毫秒 使用兩個(gè)for循環(huán)實(shí)現(xiàn)List去重:533毫秒 使用List集合contains方法循環(huán)遍歷:40毫秒
更多測試結(jié)果
隨機(jī)數(shù)在100范圍內(nèi):
使用HashSet實(shí)現(xiàn)List去重時(shí)間:32毫秒 使用TreeSet實(shí)現(xiàn)List去重時(shí)間:40毫秒 使用java8新特性stream實(shí)現(xiàn)List去重:128毫秒 使用兩個(gè)for循環(huán)實(shí)現(xiàn)List去重:693毫秒 使用List集合contains方法循環(huán)遍歷:30毫秒
隨機(jī)數(shù)在1000范圍內(nèi):
使用HashSet實(shí)現(xiàn)List去重時(shí)間:34毫秒 使用TreeSet實(shí)現(xiàn)List去重時(shí)間:72毫秒 使用java8新特性stream實(shí)現(xiàn)List去重:125毫秒 使用兩個(gè)for循環(huán)實(shí)現(xiàn)List去重:1063毫秒 使用List集合contains方法循環(huán)遍歷:85毫秒
隨機(jī)數(shù)在10000范圍內(nèi):
使用HashSet實(shí)現(xiàn)List去重時(shí)間:51毫秒 使用TreeSet實(shí)現(xiàn)List去重時(shí)間:103毫秒 使用java8新特性stream實(shí)現(xiàn)List去重:201毫秒 使用兩個(gè)for循環(huán)實(shí)現(xiàn)List去重:5448毫秒 使用List集合contains方法循環(huán)遍歷:791毫秒
結(jié)論
無序HashSet,有序TreeSet
推薦閱讀
這應(yīng)該是全網(wǎng)最全的Git分支開發(fā)規(guī)范手冊~
圖片驗(yàn)證碼的需求分析、優(yōu)雅實(shí)現(xiàn)
一個(gè)小小的簽到功能,到底用MySQL還是Redis?
最后,推薦給大家一個(gè)有趣有料的公眾號(hào):寫代碼的渣渣鵬,7年老程序員教你寫bug,回復(fù)?面試或資源 送一你整套開發(fā)筆記 有驚喜哦
評論
圖片
表情

