在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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


前言

最近又是一輪代碼review , 發現了一些實現去重的代碼,在使用 lsit.contain ......

如:

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

正文

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

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 開始去重,條數:"+testList.size());
ListtestListDistinctResult=newArrayList<>();
for(Stringstr:testList){
if(!testListDistinctResult.contains(str)){
testListDistinctResult.add(str);
}
}
System.out.println("contains 去重完畢,條數:"+testListDistinctResult.size());
}

我們調用一下看看耗時:

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 不存在 重復數據, 所以我們來看看 使用HashSet去重的性能:

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

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

我們調用一下看看耗時:

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

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

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

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

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

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

ps:順嘴說下 hashset的 contain

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

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

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

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

雙for循環 ,remove去重

/**
*使用雙for循環去重
*@paramtestList
*/
privatestaticvoiduse2ForDistinct(ListtestList){
System.out.println("list 雙循環開始去重,條數:"+testList.size());
for(inti=0;ifor(intj=i+1;jif(testList.get(i).equals(testList.get(j))){
testList.remove(j);
}
}
}
System.out.println("list 雙循環去重完畢,條數:"+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 開始去重,條數:"+testList.size());
ListtestListDistinctResult=testList.stream().distinct().collect(Collectors.toList());
System.out.println("stream 去重完畢,條數:"+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

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

好了,該篇就到這。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7233

    瀏覽量

    90784
  • 代碼
    +關注

    關注

    30

    文章

    4882

    瀏覽量

    70046
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14807

原文標題:不好意思,list.contain 去重該換換了!

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

    現在不聊點物聯網沾邊的事情都不好意思說自己電子工程師。所以,ARM mbed OS來了。
    發表于 08-04 09:56 ?2993次閱讀

    eg8010產生spwm波的非常好用!!!

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

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

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

    不好意思,我刪了

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

    labview模擬電壓檢測顯示系統

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

    LM386簡單運放***

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

    零基礎三天三十元做出智能車

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

    網上買了快開發板,分享一下資料

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

    開關電源仿真

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

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

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

    怎樣判斷汽車電瓶該換了

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

    proteus中英文對照

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

    新27英寸iMac評測:全身是細節的高生產力工作設備

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

    美圖m8怎么樣 私人美顏師

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

    Clock Gating的特點、原理和初步實現

    當下這社會,沒有幾萬個Clock Gating,出門都不好意思和別人打招呼!
    的頭像 發表于 07-17 16:50 ?5093次閱讀
    Clock Gating的特點、原理和初步實現
    主站蜘蛛池模板: 一区二区三区四区视频在线 | 国产黄色小视频在线观看 | 欧美黑人xxxx猛牲大交 | 色老头网址| 永久网站色视频在线观看免费 | 在线麻豆国产传媒60在线观看 | 97午夜影院 | 亚洲成人国产 | 日日摸夜夜爽夜夜爽出水 | 特黄十八岁大片 | 午夜精品在线观看 | 白丝丝袜高跟国产在线视频 | 久久久久国产成人精品亚洲午夜 | 亚洲欧美国产高清va在线播放 | 狠狠干2019| 四虎伦理 | 日韩欧美一区二区三区不卡视频 | 色视频观看 | haodiaose在线精品免费观看 | 一级视频在线免费观看 | 国产理论视频 | 欧美18同性gay视频 | 亚洲免费国产 | 欧美一卡2卡三卡四卡五卡 欧美一卡二卡3卡4卡无卡六卡七卡科普 | 免费黄色大片视频 | 最新色网站 | 日本在线黄色网址 | 中文字幕成人乱码在线电影 | 综合色久七七综合七七蜜芽 | 日本精高清区一 | 天天综合天天添夜夜添狠狠添 | 色姑娘天天干 | 婷婷开心激情网 | 五月天精品在线 | 婷婷五月情 | 免费边摸边吃奶边叫床视频gif | 亚洲地址一地址二地址三 | 免费在线成人网 | 色批| 免费在线黄网 | 看全色黄大色大片免费久久怂 |