最近中文字幕国语免费完整,中文亚洲无线码49vv,中文无码热在线视频,亚洲自偷自拍熟女另类,中文字幕高清av在线

當(dāng)前位置: 首頁 > 技術(shù)教程

Java 集合 List 怎么使用? ArrayList 和 LinkedList 哪個(gè)好?

  List 是 Java 集合框架中最常用的接口之一,它繼承自 Collection 接口,具有有序性(元素按插入順序排列)和可重復(fù)性(允許存儲(chǔ)相同元素)的特點(diǎn),支持通過索引位置訪問和操作元素。ArrayList 和 LinkedList 是 List 接口的兩個(gè)主要實(shí)現(xiàn)類,各自基于不同的數(shù)據(jù)結(jié)構(gòu),適用場景存在差異。掌握 List 的基本用法及兩者的區(qū)別,能幫助開發(fā)者在實(shí)際開發(fā)中選擇更高效的集合實(shí)現(xiàn)。

  一、Java 集合 List 的基本使用

  List 接口的使用需先創(chuàng)建實(shí)現(xiàn)類的對(duì)象(如 ArrayList 或 LinkedList),再通過接口定義的方法操作元素,核心方法包括添加、刪除、查詢、修改等。

  (一)創(chuàng)建 List 對(duì)象

  // 導(dǎo)入List和ArrayList/LinkedList所在包import java.util.List;import java.util.ArrayList;import java.util.LinkedList;// 創(chuàng)建ArrayList對(duì)象(基于動(dòng)態(tài)數(shù)組)List<String> arrayList = new ArrayList<>();// 創(chuàng)建LinkedList對(duì)象(基于雙向鏈表)List<Integer> linkedList = new LinkedList<>();

  (二)常用方法及示例

  添加元素:add(E e)(末尾添加)、add(int index, E e)(指定位置插入)

  List<String> list = new ArrayList<>();list.add("蘋果"); // 末尾添加:[蘋果]list.add(0, "香蕉"); // 索引0插入:[香蕉, 蘋果]

  獲取元素:get(int index)(通過索引獲取)

  String fruit = list.get(1); // 獲取索引1的元素:"蘋果"

  修改元素:set(int index, E e)(替換指定位置元素)

  list.set(0, "橙子"); // 替換索引0的元素:[橙子, 蘋果]

  刪除元素:remove(int index)(刪除指定位置元素)、remove(Object o)(刪除指定元素)

  list.remove(1); // 刪除索引1的元素:[橙子]list.remove("橙子"); // 刪除元素"橙子":[]

  其他常用方法:

  size():返回元素個(gè)數(shù);

  isEmpty():判斷是否為空;

  contains(Object o):判斷是否包含指定元素;

  clear():清空所有元素。

圖片2.png

  二、ArrayList 與 LinkedList 的核心區(qū)別

  ArrayList 和 LinkedList 均實(shí)現(xiàn)了 List 接口,但底層數(shù)據(jù)結(jié)構(gòu)不同,導(dǎo)致兩者在性能、內(nèi)存占用等方面存在顯著差異。

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

  ArrayList:基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),元素存儲(chǔ)在連續(xù)的內(nèi)存空間中,通過索引直接訪問(類似數(shù)組,但容量可動(dòng)態(tài)擴(kuò)容)。

  LinkedList:基于雙向鏈表實(shí)現(xiàn),元素存儲(chǔ)在非連續(xù)的節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)包含前驅(qū)、后繼指針和元素值,需通過指針遍歷訪問。

  (二)性能對(duì)比

  隨機(jī)訪問(get/set 操作):

  ArrayList 優(yōu)勢明顯:通過索引直接定位元素,時(shí)間復(fù)雜度為 O(1)(常數(shù)級(jí));

  LinkedList 效率低:需從鏈表頭或尾遍歷至目標(biāo)索引,時(shí)間復(fù)雜度為 O(n)(線性級(jí)),元素越多,性能差距越大。

  插入 / 刪除操作:

  頭部 / 中間插入 / 刪除:LinkedList 更優(yōu),只需修改節(jié)點(diǎn)指針,時(shí)間復(fù)雜度 O(1)(找到節(jié)點(diǎn)后);ArrayList 需移動(dòng)插入 / 刪除位置后的所有元素,時(shí)間復(fù)雜度 O(n)。

  尾部插入 / 刪除:兩者性能接近,ArrayList 直接在末尾添加(若無需擴(kuò)容),LinkedList 只需修改尾節(jié)點(diǎn)指針。

  內(nèi)存占用:

  ArrayList 內(nèi)存占用較緊湊,僅存儲(chǔ)元素本身(動(dòng)態(tài)數(shù)組可能預(yù)留部分容量,存在少量內(nèi)存浪費(fèi));

  LinkedList 每個(gè)元素需額外存儲(chǔ)前后指針,內(nèi)存開銷更大。

  (三)適用場景

  優(yōu)先選擇 ArrayList:

  頻繁進(jìn)行隨機(jī)訪問(如通過索引獲取元素);

  元素?cái)?shù)量穩(wěn)定,插入 / 刪除操作主要在尾部;

  對(duì)內(nèi)存占用較敏感的場景。

  優(yōu)先選擇 LinkedList:

  頻繁在頭部、中間進(jìn)行插入 / 刪除操作(如實(shí)現(xiàn)隊(duì)列、棧等數(shù)據(jù)結(jié)構(gòu));

  元素?cái)?shù)量動(dòng)態(tài)變化大,且插入 / 刪除操作密集。

  示例:性能差異體現(xiàn)

  // 場景1:隨機(jī)訪問密集List<Integer> arrayList = new ArrayList<>();for (int i = 0; i < 10000; i++) { arrayList.add(i);}long start = System.currentTimeMillis();for (int i = 0; i < 10000; i++) { arrayList.get(i); // 高效:直接索引訪問}System.out.println("ArrayList隨機(jī)訪問耗時(shí):" + (System.currentTimeMillis() - start) + "ms");// 場景2:中間插入密集List<Integer> linkedList = new LinkedList<>();start = System.currentTimeMillis();for (int i = 0; i < 1000; i++) { linkedList.add(0, i); // 高效:頭部插入只需修改指針}System.out.println("LinkedList頭部插入耗時(shí):" + (System.currentTimeMillis() - start) + "ms");

  三、使用注意事項(xiàng)

  ArrayList 擴(kuò)容機(jī)制:默認(rèn)初始容量為 10,當(dāng)元素滿時(shí)自動(dòng)擴(kuò)容至原來的 1.5 倍(通過復(fù)制數(shù)組實(shí)現(xiàn)),頻繁擴(kuò)容會(huì)影響性能。若已知元素?cái)?shù)量,可在創(chuàng)建時(shí)指定容量(如new ArrayList<>(1000)),減少擴(kuò)容次數(shù)。

  LinkedList 的遍歷效率:使用增強(qiáng) for 循環(huán)(foreach)或迭代器遍歷 LinkedList 效率較高,避免通過get(index)遍歷(性能極差)。

  線程安全性:兩者均為非線程安全集合,多線程環(huán)境下需通過Collections.synchronizedList(List)包裝,或使用CopyOnWriteArrayList替代。

  List 接口的使用需結(jié)合具體場景選擇實(shí)現(xiàn)類:ArrayList 適合隨機(jī)訪問為主的場景,LinkedList 適合插入 / 刪除密集的場景,不存在絕對(duì)的 “更好”,只有 “更合適”。掌握兩者的底層原理和性能特性,能幫助開發(fā)者寫出更高效的代碼,避免因選擇不當(dāng)導(dǎo)致的性能瓶頸。

 


猜你喜歡