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

Java面試崗常見(jiàn)問(wèn)題之ArrayList和LinkedList的區(qū)別

 更新時(shí)間:2022年01月23日 14:53:35   作者:執(zhí)?梗  
ArrayList和LinkedList作為我們Java中最常使用的集合類(lèi),很多人在被問(wèn)到他們的區(qū)別時(shí),憋了半天僅僅冒出一句:一個(gè)是數(shù)組一個(gè)是鏈表。這樣回答簡(jiǎn)直讓面試官吐血。為了讓兄弟們打好基礎(chǔ),我們通過(guò)實(shí)際的使用測(cè)試,好好說(shuō)一下ArrayList和LinkedList的區(qū)別這道經(jīng)典的面試題

1.ArrayList和LinkedList是什么?

在我看來(lái),要想搞清楚ArrayList和LinkedList有什么區(qū)別,首先一定得要知道這兩個(gè)東西到底是什么。因?yàn)樵谖铱磥?lái),通常拿來(lái)被比較有區(qū)別的東西,它們大體上一定存在很多相似的地方。為了剖析本質(zhì),我們直接看看它們的源碼聲明。

 Arraylist:

 LinkedList:

可以看出ArrayList和LinkedList都是List接口下的實(shí)現(xiàn)類(lèi),而List接口可以說(shuō)是集合類(lèi)中最常用的接口了,它是一個(gè)元素有序、可以重復(fù)、可以為null的集合。而且List接口的元素,都可以直接通過(guò)下標(biāo)索引獲取。既然如此,那么說(shuō)明ArrayList和LinkedList都具有上述的功能,那他們使用起來(lái)的效率到底有什么區(qū)別呢?

2.ArrayList和LinkedList性能比較               

1.插入效率比較

因?yàn)樯厦嫖覀円呀?jīng)提到過(guò)這兩者都是主要用來(lái)存儲(chǔ)元素的集合類(lèi),那我們可以使用較大的數(shù)據(jù)量,來(lái)測(cè)試一下它們插入的效率如何      

//插入到頭部
public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        LinkedList<Integer> list2 = new LinkedList<>();
 
        long time1 = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            list1.add(0,i);
        }
        long time2 = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            list2.add(0,i);
        }
        long time3 = System.currentTimeMillis();
        //ArrayList的插入時(shí)間
        System.out.println(time2-time1);//58746
        //LinkedList的插入時(shí)間
        System.out.println(time3-time2);//124
    }
     //插入到尾部
     public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        LinkedList<Integer> list2 = new LinkedList<>();
 
        long time1 = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            list1.add(i);
        }
        long time2 = System.currentTimeMillis();
        for (int i = 0; i < 1000000; i++) {
            list2.add(i);
        }
        long time3 = System.currentTimeMillis();
        //ArrayList的插入時(shí)間
        System.out.println(time2-time1);//23
        //LinkedList的插入時(shí)間
        System.out.println(time3-time2);//140
    }

大家發(fā)現(xiàn)沒(méi)有,當(dāng)插入100萬(wàn)個(gè)元素到頭部時(shí),LinkedList的速率竟然是ArrayList五千倍之多,當(dāng)我們插入100萬(wàn)個(gè)元素到尾部時(shí),但是又發(fā)現(xiàn)ArrayList的速率比LinkedList還快,這是為什么呢?

其實(shí)做這個(gè)實(shí)驗(yàn),是為了打消許多人的誤區(qū)——LinkedList的插入效率一定比ArrayList要高。沒(méi)錯(cuò),理論上確實(shí)是如此,因?yàn)锳rraylist的底層是數(shù)組實(shí)現(xiàn),而LinkedList的底層為雙向鏈表。在初學(xué)數(shù)據(jù)結(jié)構(gòu)時(shí)鏈表的插入效率高于數(shù)組這是我們就學(xué)習(xí)過(guò)的知識(shí),可實(shí)際上在這里其實(shí)當(dāng)數(shù)據(jù)量越來(lái)越大時(shí),ArrayList的插入和刪除效率是比LinkedList越來(lái)越高的,這涉及到數(shù)組和鏈表在元素操作上的問(wèn)題。但其實(shí)在元素量較少時(shí),兩者的效率幾乎所差無(wú)幾。        

2.查詢(xún)效率比較

我們向ArrayList和LinkedList同時(shí)插入10萬(wàn)條數(shù)據(jù),然后去索引每個(gè)下標(biāo),測(cè)試一下兩者的查詢(xún)效率如何        

 public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        LinkedList<Integer> list2 = new LinkedList<>();
        //先放入一百萬(wàn)個(gè)元素
        for (int i = 0; i < 100000; i++) {
            list1.add(i);
            list2.add(i);
        }
        long time1 = System.currentTimeMillis();
        for (int i = 0; i <list1.size() ; i++) {
            list1.get(i);
        }
        long time2 = System.currentTimeMillis();
        for (int i = 0; i <list2.size() ; i++) {
            list2.get(i);
        }
        long time3 = System.currentTimeMillis();
        System.out.println(time2-time1);//1
        System.out.println(time3-time2);//5479
    }

從測(cè)試的結(jié)果來(lái)看,并沒(méi)有出乎我們的意外,因?yàn)锳rrayList的底層為數(shù)組實(shí)現(xiàn),對(duì)于任何一個(gè)下標(biāo)的索引都是O(1)的時(shí)間復(fù)雜度。而LinkedList的底層為雙向鏈表,對(duì)于查詢(xún)索引需要從頭部或者尾部去遍歷找到下標(biāo)。   

3.刪除效率比較

我們同樣向ArrayList和LinkedList放入100萬(wàn)個(gè)元素,然后同樣測(cè)試從頭部刪除和從尾部刪除有什么區(qū)別,來(lái)測(cè)試一下他們的刪除效率。

從尾部刪除:

public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        LinkedList<Integer> list2 = new LinkedList<>();
        //先放入一百萬(wàn)個(gè)元素
        for (int i = 0; i < 1000000; i++) {
            list1.add(i);
            list2.add(i);
        }
        long time1 = System.currentTimeMillis();
        for (int i = 1000000; i >0 ; i--){
            list1.remove(i-1);
        }
        long time2 = System.currentTimeMillis();
        for (int i = 1000000; i >0 ; i--) {
            list2.remove(i-1);
        }
        long time3 = System.currentTimeMillis();
        //ArrayList的刪除時(shí)間
        System.out.println(time2-time1);//8
        //LinkedList的刪除時(shí)間
        System.out.println(time3-time2);//18
    }

從頭部刪除:

public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        LinkedList<Integer> list2 = new LinkedList<>();
        //先放入一百萬(wàn)個(gè)元素
        for (int i = 0; i < 1000000; i++) {
            list1.add(i);
            list2.add(i);
        }
        long time1 = System.currentTimeMillis();
        for (int i = 1000000; i >0 ; i--){
            list1.remove(0);
        }
        long time2 = System.currentTimeMillis();
        for (int i = 1000000; i >0 ; i--) {
            list2.remove(0);
        }
        long time3 = System.currentTimeMillis();
        System.out.println(time2-time1);//55962
        System.out.println(time3-time2);//14
    }

       大家發(fā)現(xiàn)了嗎,從尾部刪除的時(shí)候,ArrayList的速度比LinkedList快,而從頭部刪除后,ArrayList就不知道被LinkedList甩了幾條街去了。其實(shí)刪除同插入其實(shí)是一樣的,再次實(shí)踐一次是想讓大家加深印象,能走出誤區(qū)。

4.實(shí)驗(yàn)總結(jié)

       之所以會(huì)做這幾個(gè)實(shí)驗(yàn),不僅僅是為了讓大家更加深刻的去認(rèn)識(shí)ArrayList和LinkedList,也是想讓大家走出一些誤區(qū),比如什么LinkedList插入刪除一定比ArrayList快啊,ArrayList查詢(xún)一定比LinkedList快啊,從理論上來(lái)說(shuō)確實(shí)如此,但通過(guò)實(shí)驗(yàn)以后,我們應(yīng)該這樣表達(dá):

       1.在數(shù)據(jù)量不大時(shí),ArrayList和LinkedList的查詢(xún)效率其實(shí)所差無(wú)幾,只有在數(shù)據(jù)量較大時(shí),ArrayList會(huì)對(duì)比出優(yōu)勢(shì)

       2.在插入和刪除上,LinkedList并不一定ArrayList效率更好,這與數(shù)據(jù)量以及插入和刪除的位置都是有關(guān)系的        

3.面試標(biāo)準(zhǔn)回答

       1.ArrayList底層為數(shù)組實(shí)現(xiàn),LinkedList底層為雙向鏈表實(shí)現(xiàn)。ArrayList只能作為列表使用,LinkedList還能作為隊(duì)列,因?yàn)閷?shí)現(xiàn)了Deque接口。

       2.LinkedList在數(shù)組中的開(kāi)銷(xiāo)更大,因?yàn)樗粌H需要存儲(chǔ)元素,還需要保存前后結(jié)點(diǎn)的地址,而ArrayList更加輕量級(jí)。

       3. 在插入和刪除效率上,理論上LinkedList優(yōu)于ArrayList,但這還與數(shù)據(jù)量與處理的位置有關(guān)系,但查詢(xún)的效率上ArrayList更占有優(yōu)勢(shì)   

如果兄弟們?cè)趯?shí)際使用時(shí)實(shí)在糾結(jié)用哪個(gè),那就無(wú)腦使用Arraylist吧,別問(wèn),問(wèn)就是它更好用!      

到此這篇關(guān)于Java面試崗常見(jiàn)問(wèn)題之ArrayList和LinkedList的區(qū)別的文章就介紹到這了,更多相關(guān)Java ArrayList和LinkedList的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中DecimalFormat用法及符號(hào)含義

    Java中DecimalFormat用法及符號(hào)含義

    DecimalFormat是NumberFormat的一個(gè)具體子類(lèi),用于格式化十進(jìn)制數(shù)字。這篇文章介紹了DecimalFormat的用法及符號(hào)含義,需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • Java源碼解析Integer方法解讀

    Java源碼解析Integer方法解讀

    這篇文章主要介紹了Java源碼解析Integer方法解讀,包括toString方法、toUnsignedString方法、highestOneBit方法等,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Spring Boot+Mybatis+Pagehelper分頁(yè)實(shí)現(xiàn)

    Spring Boot+Mybatis+Pagehelper分頁(yè)實(shí)現(xiàn)

    本篇文章主要講述的是Spring Boot+Mybatis+Pagehelper分頁(yè)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot中自定義參數(shù)綁定步驟詳解

    SpringBoot中自定義參數(shù)綁定步驟詳解

    這篇文章主要介紹了SpringBoot中自定義參數(shù)綁定步驟詳解,非常不錯(cuò),具有參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-02-02
  • MapStruct @Mapping注解之處理映射中的Null值方式

    MapStruct @Mapping注解之處理映射中的Null值方式

    這篇文章主要介紹了MapStruct @Mapping注解之處理映射中的Null值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • idea下載svn的項(xiàng)目并且運(yùn)行操作

    idea下載svn的項(xiàng)目并且運(yùn)行操作

    這篇文章主要介紹了idea下載svn的項(xiàng)目并且運(yùn)行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Spring Boot 防止接口惡意刷新和暴力請(qǐng)求的實(shí)現(xiàn)

    Spring Boot 防止接口惡意刷新和暴力請(qǐng)求的實(shí)現(xiàn)

    本文主要介紹了Spring Boot 防止接口惡意刷新和暴力請(qǐng)求的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java中的ArrayList(擴(kuò)容機(jī)制)詳解

    Java中的ArrayList(擴(kuò)容機(jī)制)詳解

    ArrayList作為Java中廣泛使用的動(dòng)態(tài)數(shù)組,其擴(kuò)容機(jī)制是保證性能和內(nèi)存使用平衡的關(guān)鍵,默認(rèn)初始容量為10,擴(kuò)容因子為1.5,旨在減少頻繁的內(nèi)存分配和數(shù)據(jù)遷移代價(jià),同時(shí)建議使用預(yù)估計(jì)的初始化容量以減少擴(kuò)容次數(shù)
    2024-11-11
  • idea配置檢查XML中SQL語(yǔ)法及書(shū)寫(xiě)sql語(yǔ)句智能提示的方法

    idea配置檢查XML中SQL語(yǔ)法及書(shū)寫(xiě)sql語(yǔ)句智能提示的方法

    idea連接了數(shù)據(jù)庫(kù),也可以執(zhí)行SQL查到數(shù)據(jù),但是無(wú)法識(shí)別sql語(yǔ)句中的表導(dǎo)致沒(méi)有提示,下面這篇文章主要給大家介紹了關(guān)于idea配置檢查XML中SQL語(yǔ)法及書(shū)寫(xiě)sql語(yǔ)句智能提示的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • spring boot配置druid連接池的完整步驟

    spring boot配置druid連接池的完整步驟

    這篇文章主要給大家介紹了關(guān)于spring boot配置druid連接池的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01

最新評(píng)論

顺义区| 廊坊市| 南投县| 大邑县| 谷城县| 新民市| 兴安县| 扬州市| 玉山县| 高雄县| 寿宁县| 沙湾县| 平罗县| 罗源县| 晋中市| 兴国县| 类乌齐县| 嘉黎县| 武义县| 绍兴县| 阿拉善盟| 西城区| 云和县| 曲麻莱县| 雷山县| 和田市| 永嘉县| 阿鲁科尔沁旗| 青龙| 吉木萨尔县| 临桂县| 洛隆县| 白银市| 文昌市| 东兰县| 丽水市| 天等县| 新河县| 平舆县| 杨浦区| 永新县|