欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中ArrayList和LinkedList有什么區(qū)別舉例詳解

 更新時間:2025年02月21日 09:37:51   作者:一只蜘豬  
這篇文章主要介紹了Java中ArrayList和LinkedList區(qū)別的相關(guān)資料,包括數(shù)據(jù)結(jié)構(gòu)特性、核心操作性能、內(nèi)存與GC影響、擴(kuò)容機(jī)制、線程安全與并發(fā)方案,以及工程實(shí)踐場景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、底層數(shù)據(jù)結(jié)構(gòu)

特性ArrayListLinkedList
實(shí)現(xiàn)方式基于動態(tài)數(shù)組基于雙向鏈表
內(nèi)存布局連續(xù)內(nèi)存塊,支持快速隨機(jī)訪問離散節(jié)點(diǎn),每個節(jié)點(diǎn)包含數(shù)據(jù)及前后指針
默認(rèn)初始容量10(擴(kuò)容時增長 50%)無預(yù)分配容量,動態(tài)添加節(jié)點(diǎn)

二、核心操作性能對比

// ArrayList的隨機(jī)訪問示例
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
int val1 = arrayList.get(0);  // O(1)

// LinkedList的順序訪問示例
LinkedList<Integer> linkedList = new LinkedList<>();
linkedList.add(1);
int val2 = linkedList.get(0);  // O(n)
操作ArrayList 時間復(fù)雜度LinkedList 時間復(fù)雜度
隨機(jī)訪問(get/set)O(1)O(n)
頭部插入/刪除O(n)(需移動元素)O(1)
尾部插入/刪除分?jǐn)?O(1)(無擴(kuò)容時 O(1))O(1)
中間插入/刪除O(n)O(n)(需遍歷到目標(biāo)位置)

三、內(nèi)存與 GC 影響

維度ArrayListLinkedList
內(nèi)存占用僅存儲元素 + 數(shù)組頭(內(nèi)存緊湊)每個節(jié)點(diǎn)額外存儲兩個指針(對象頭 + 前后引用)
GC 壓力整體回收高效(單個數(shù)組對象)頻繁增刪產(chǎn)生大量小對象,增加 GC 負(fù)擔(dān)
緩存局部性高(連續(xù)內(nèi)存,CPU 預(yù)加載命中率高)低(節(jié)點(diǎn)分散,緩存未命中率高)

四、擴(kuò)容機(jī)制

  • ArrayList 擴(kuò)容流程

    // 擴(kuò)容核心邏輯(JDK17)
    int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5倍擴(kuò)容
    elementData = Arrays.copyOf(elementData, newCapacity);
    
    • 代價:數(shù)據(jù)復(fù)制導(dǎo)致 O(n) 時間復(fù)雜度
    • 優(yōu)化建議:初始化時預(yù)估容量(new ArrayList<>(initialCapacity)
  • LinkedList 無擴(kuò)容:動態(tài)添加節(jié)點(diǎn),但每個節(jié)點(diǎn)額外占用 24 字節(jié)(64 位 JVM)

五、線程安全與并發(fā)方案

方案ArrayListLinkedList
默認(rèn)線程安全
同步包裝類Collections.synchronizedList()Collections.synchronizedList()
高并發(fā)替代方案CopyOnWriteArrayListConcurrentLinkedDeque

六、工程實(shí)踐場景

1. 電商商品列表展示

  • 選擇 ArrayList

    • 高頻讀取商品信息(隨機(jī)訪問)
    • 批量更新時通過尾插法優(yōu)化(addAll()
    List<Product> products = new ArrayList<>(10000); // 預(yù)分配容量
    

2. 實(shí)時消息隊(duì)列

  • 選擇 LinkedList

    • 高頻頭尾操作(addFirst()/removeLast()
    • 使用迭代器避免隨機(jī)訪問:
    LinkedList<Message> queue = new LinkedList<>();
    // 生產(chǎn)者
    queue.offer(new Message());
    // 消費(fèi)者(高效遍歷)
    Iterator<Message> it = queue.iterator();
    while(it.hasNext()) process(it.next());
    

3. 多線程日志處理器

  • 選擇 CopyOnWriteArrayList

    • 寫操作極少(日志初始化配置)
    • 高頻遍歷讀取日志規(guī)則
    CopyOnWriteArrayList<LogRule> rules = new CopyOnWriteArrayList<>();
    // 寫操作(僅在配置更新時觸發(fā))
    rules.add(new LogRule());
    // 讀操作(無鎖并發(fā))
    rules.forEach(LogService::applyRule);
    

七、性能對比測試數(shù)據(jù)

測試環(huán)境:JDK17,10 萬次操作,i7-11800H

測試場景ArrayList 耗時LinkedList 耗時差異原因
隨機(jī)訪問 1 萬次2ms650ms數(shù)組 O(1) vs 鏈表 O(n) 遍歷
尾部插入 1 萬次3ms5ms均攤 O(1),鏈表節(jié)點(diǎn)創(chuàng)建開銷略高
頭部插入 1 萬次420ms8ms數(shù)組需移動元素,鏈表直接修改指針
遍歷所有元素15ms18ms數(shù)組緩存命中率高

八、高級特性對比

特性ArrayListLinkedList
實(shí)現(xiàn)接口ListList + Deque
序列化效率高(連續(xù)數(shù)據(jù),可批量寫入)低(需逐個節(jié)點(diǎn)處理)
內(nèi)存池兼容性適合對象池化(數(shù)組整體復(fù)用)節(jié)點(diǎn)分散,池化效果差
批量操作優(yōu)化System.arraycopy() 高效需要逐個節(jié)點(diǎn)操作

九、選型決策樹

通過以上對比,開發(fā)者可根據(jù)具體場景選擇最合適的實(shí)現(xiàn):

  • 優(yōu)先 ArrayList:適用于 90% 的常規(guī)場景(讀多寫少、內(nèi)存敏感)
  • 慎用 LinkedList:僅在需要頻繁頭尾操作或?qū)崿F(xiàn)雙端隊(duì)列時選用
  • 線程安全場景:根據(jù)寫頻率選擇 CopyOnWriteArrayList 或同步包裝類

結(jié)論

  • ArrayList 更適合:如果你的操作主要集中在隨機(jī)訪問和列表末尾的插入刪除,且你希望節(jié)省內(nèi)存,ArrayList 是首選。

  • LinkedList 更適合:如果你的操作主要是頻繁在列表中間進(jìn)行插入和刪除,而隨機(jī)訪問較少,LinkedList 會表現(xiàn)得更好。

總結(jié) 

到此這篇關(guān)于Java中ArrayList和LinkedList有什么區(qū)別的文章就介紹到這了,更多相關(guān)Java中ArrayList和LinkedList區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的線程中斷機(jī)制和LockSupport詳解

    Java中的線程中斷機(jī)制和LockSupport詳解

    這篇文章主要介紹了Java中的線程中斷機(jī)制和LockSupport詳解,在Java中沒有辦法立即停止一條線程,然而停止線程卻顯得尤為重要,如取消一個耗時操作,因此,Java提供了一種用于停止線程的協(xié)商機(jī)制中斷,也即中斷標(biāo)識協(xié)商機(jī)制,需要的朋友可以參考下
    2023-09-09
  • Springboot項(xiàng)目啟動不加載resources目錄下的文件問題

    Springboot項(xiàng)目啟動不加載resources目錄下的文件問題

    這篇文章主要介紹了Springboot項(xiàng)目啟動不加載resources目錄下的文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java的List集合框架之ArrayList詳解

    Java的List集合框架之ArrayList詳解

    這篇文章主要介紹了Java的List集合框架之ArrayList詳解,ArrayList默認(rèn)容量為10(構(gòu)造方法未指定初始容量為0),擴(kuò)容是利用位運(yùn)算(右移一位)和直接相加進(jìn)行1.5倍擴(kuò)容,需要的朋友可以參考下
    2023-11-11
  • JavaWeb利用郵箱幫用戶找回密碼

    JavaWeb利用郵箱幫用戶找回密碼

    這篇文章主要為大家詳細(xì)介紹了JavaWeb利用郵箱幫用戶找回密碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • SpringBoot下使用自定義監(jiān)聽事件的流程分析

    SpringBoot下使用自定義監(jiān)聽事件的流程分析

    事件機(jī)制是Spring的一個功能,目前我們使用了SpringBoot框架,所以記錄下事件機(jī)制在SpringBoot框架下的使用,同時實(shí)現(xiàn)異步處理,這篇文章主要介紹了SpringBoot下使用自定義監(jiān)聽事件,需要的朋友可以參考下
    2023-08-08
  • java screen的配置詳解及注意事項(xiàng)

    java screen的配置詳解及注意事項(xiàng)

    這篇文章主要介紹了java screen的配置詳解及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 劍指Offer之Java算法習(xí)題精講鏈表專題篇

    劍指Offer之Java算法習(xí)題精講鏈表專題篇

    跟著思路走,之后從簡單題入手,反復(fù)去看,做過之后可能會忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • Java可變個數(shù)形參的方法實(shí)例代碼

    Java可變個數(shù)形參的方法實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java可變個數(shù)形參的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-02-02
  • Spring RestTemplate簡化HTTP通信實(shí)現(xiàn)功能探究

    Spring RestTemplate簡化HTTP通信實(shí)現(xiàn)功能探究

    這篇文章主要為大家介紹了Spring框架中的RestTemplate,如果你是個Java程序員,那么你肯定知道Spring框架的重要性,在Spring的眾多工具中,RestTemplate是用來簡化HTTP通信的一個強(qiáng)大工具
    2024-01-01
  • java dump文件怎么生成和分析-JMAP用法詳解

    java dump文件怎么生成和分析-JMAP用法詳解

    這篇文章主要介紹了java dump文件怎么生成和分析-JMAP用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論