RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

不好意思,list.contain 去重該換換了!

jf_ro2CN3Fa ? 來源:csdn ? 2023-09-14 15:50 ? 次閱讀


前言

最近又是一輪代碼review , 發(fā)現(xiàn)了一些實現(xiàn)去重的代碼,在使用 lsit.contain ......

如:

e47d2246-52c5-11ee-a25d-92fbcf53809c.png

我沉思,是不是其實很多初學(xué)者也存在這種去重使用問題?

所以我選擇把這個事情整出來,分享一下。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

正文

首先是造出一個 List 模擬數(shù)據(jù),一共2W條,里面有一半數(shù)據(jù)1W條是重復(fù)的:

publicstaticListgetTestList(){
Listlist=newArrayList<>();
for(inti=1;i<=?10000;i++){
list.add(String.valueOf(i));
}
for(inti=10000;i>=1;i--){
list.add(String.valueOf(i));
}
returnlist;
}

先看看 我們用contain 去重的 代碼:

/**
*使用list.contain去重
*
*@paramtestList
*/
privatestaticvoiduseContain2Distinct(ListtestList){
System.out.println("contains 開始去重,條數(shù):"+testList.size());
ListtestListDistinctResult=newArrayList<>();
for(Stringstr:testList){
if(!testListDistinctResult.contains(str)){
testListDistinctResult.add(str);
}
}
System.out.println("contains 去重完畢,條數(shù):"+testListDistinctResult.size());
}

我們調(diào)用一下看看耗時:

publicstaticvoidmain(String[]args){
ListtestList=getTestList();
StopWatchstopWatch=newStopWatch();
stopWatch.start();
useContainDistinct(testList);
stopWatch.stop();
System.out.println("去重最終耗時"+stopWatch.getTotalTimeMillis());
}

耗時:

e4e0cf62-52c5-11ee-a25d-92fbcf53809c.png

評價:list.contain 的效率,我的建議是,知道就行,別用。

眾所周知Set 不存在 重復(fù)數(shù)據(jù), 所以我們來看看 使用HashSet去重的性能:

ps:這里是采取使用 set的add 方法做去重

/**
*使用set去重
*
*@paramtestList
*/
privatestaticvoiduseSetDistinct(ListtestList){
System.out.println("HashSet.add 開始去重,條數(shù):"+testList.size());
ListtestListDistinctResult=newArrayList<>(newHashSet(testList));
System.out.println("HashSet.add 去重完畢,條數(shù):"+testListDistinctResult.size());
}

我們調(diào)用一下看看耗時:

publicstaticvoidmain(String[]args){
ListtestList=getTestList();
StopWatchstopWatch=newStopWatch();
stopWatch.start();
useSetDistinct(testList);
stopWatch.stop();
System.out.println("去重最終耗時"+stopWatch.getTotalTimeMillis());
}

耗時:

e4fe2a76-52c5-11ee-a25d-92fbcf53809c.png

評價:HashSet 的效率,我的建議是,推薦。

為什么耗時 差距這么大?

不多說,我們看源碼:

list.contains(o)

e52a707c-52c5-11ee-a25d-92fbcf53809c.png

可以看到里面用到了 index(o) :

e55c2b6c-52c5-11ee-a25d-92fbcf53809c.png

時間復(fù)雜度 :O(n) ,n: 元素個數(shù)

那么我們看看 set.add(o) 是怎么樣的 :

e592714a-52c5-11ee-a25d-92fbcf53809c.png

map的add , 老生常談就不談了,hash完 直接塞到某個位置, 時間復(fù)雜度 : O(1)

所以 O(n)O(1) 誰快 誰慢 ?顯然。

ps:順嘴說下 hashset的 contain

e5f8344e-52c5-11ee-a25d-92fbcf53809c.png

時間復(fù)雜度也是 :O(1)

e6436216-52c5-11ee-a25d-92fbcf53809c.png

那么我們最后再看看別的去重:

雙for循環(huán) ,remove去重

/**
*使用雙for循環(huán)去重
*@paramtestList
*/
privatestaticvoiduse2ForDistinct(ListtestList){
System.out.println("list 雙循環(huán)開始去重,條數(shù):"+testList.size());
for(inti=0;ifor(intj=i+1;jif(testList.get(i).equals(testList.get(j))){
testList.remove(j);
}
}
}
System.out.println("list 雙循環(huán)去重完畢,條數(shù):"+testList.size());
}
publicstaticvoidmain(String[]args){
ListtestList=getTestList();
StopWatchstopWatch=newStopWatch();
stopWatch.start();
use2ForDistinct(testList);
stopWatch.stop();
System.out.println("去重最終耗時"+stopWatch.getTotalTimeMillis());
}

耗時:

e67cb2e6-52c5-11ee-a25d-92fbcf53809c.png

評價:知道就行,圖個樂,別用,賊慢,而且代碼看起來亂:。

stream的distinct去重:

/**
*使用Stream去重
*
*@paramtestList
*/
privatestaticvoiduseStreamDistinct(ListtestList){
System.out.println("stream 開始去重,條數(shù):"+testList.size());
ListtestListDistinctResult=testList.stream().distinct().collect(Collectors.toList());
System.out.println("stream 去重完畢,條數(shù):"+testListDistinctResult.size());
}
publicstaticvoidmain(String[]args){
ListtestList=getTestList();
StopWatchstopWatch=newStopWatch();
stopWatch.start();
useStreamDistinct(testList);
stopWatch.stop();
System.out.println("去重最終耗時"+stopWatch.getTotalTimeMillis());
}

耗時:

e69edfb0-52c5-11ee-a25d-92fbcf53809c.png

評價:還不錯,主要是代碼也蠻簡潔,有一點點動心。

好了,該篇就到這。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7002

    瀏覽量

    88940
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14338

原文標(biāo)題:不好意思,list.contain 去重該換換了!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    “太厲害了,一定要學(xué)會它!”電子工程師未來“金主”在這!

    現(xiàn)在不聊點物聯(lián)網(wǎng)沾邊的事情都不好意思說自己電子工程師。所以,ARM mbed OS來了。
    發(fā)表于 08-04 09:56 ?2923次閱讀

    eg8010產(chǎn)生spwm波的非常好用!!!

    不好意思剛才上傳了一個要e幣的
    發(fā)表于 09-01 19:44

    我知道大過年的麻煩個位大哥大姐的不好,不過問題搞不.....

    `大過年的小弟在這給各位大哥大姐拜年了,祝各位身體健康,財源廣進(jìn)大過年的來麻煩人實在不好意思,不過有些問題憋著不知道實在難受,望好心人解釋下1,這個無線供電的電路圖里,Q2的作用是什么,Q1導(dǎo)通他才
    發(fā)表于 02-10 21:51

    不好意思,我刪了

    [ 本帖最后由 lanyue119 于 2013-3-20 09:45 編輯 ]\n\n不好意思,我刪了
    發(fā)表于 03-06 18:48

    labview模擬電壓檢測顯示系統(tǒng)

    不好意思,新人發(fā)帖,忘了加附件。
    發(fā)表于 06-16 17:17

    LM386簡單運(yùn)放***

    `簡單的***設(shè)計LM386.都不好意思拿出來了,但為了....`
    發(fā)表于 06-27 12:05

    零基礎(chǔ)三天三十元做出智能車

    不好意思,有點殘缺看看吧
    發(fā)表于 07-17 23:18

    網(wǎng)上買了快開發(fā)板,分享一下資料

    實在不好意思,限制上傳單個文件最大20M,我只能分開來傳了,我弄了個網(wǎng)盤(你們也可以注冊的,地址http://www.7958.com/r_164028.html)http://937358885.7958.com
    發(fā)表于 09-28 00:53

    開關(guān)電源仿真

    不好意思,你的問題我不會,但我想問你個問題,你仿真過開關(guān)電源電路嗎?
    發(fā)表于 06-07 09:05

    LabVIEW辭職信---搞笑界面(由于上次缺少VI,這次修改后重新發(fā))

    不好意思,上次失誤,導(dǎo)致發(fā)出去的文件丟失VI,今天重發(fā)。
    發(fā)表于 07-30 16:38

    怎樣判斷汽車電瓶該換了

    `  怎樣判斷汽車電瓶該換了?`
    發(fā)表于 11-07 17:13

    proteus中英文對照

    一些常用的proteus中英文對照,希望有幫助,內(nèi)容不多不好意思
    發(fā)表于 11-09 14:44 ?0次下載

    新27英寸iMac評測:全身是細(xì)節(jié)的高生產(chǎn)力工作設(shè)備

    中國二三線城市的快捷酒店前臺,不擺上兩臺27英寸iMac,都不好意思叫精品酒店。
    發(fā)表于 07-11 16:11 ?2533次閱讀

    美圖m8怎么樣 私人美顏師

    今年最火的時尚單品是什么?如果你的回答是星辰版的YSL,不好意思,你可能已經(jīng)走到時尚圈的外環(huán)了。
    的頭像 發(fā)表于 08-29 14:30 ?4171次閱讀

    Clock Gating的特點、原理和初步實現(xiàn)

    當(dāng)下這社會,沒有幾萬個Clock Gating,出門都不好意思和別人打招呼!
    的頭像 發(fā)表于 07-17 16:50 ?4348次閱讀
    Clock Gating的特點、原理和初步實現(xiàn)
    RM新时代网站-首页