JAVA中ArrayList與LinkedList二者特點(diǎn)與區(qū)別總結(jié)
前言
本文分別概述ArrayList和LinkList并總結(jié)二者特點(diǎn)與區(qū)別。
1.什么是ArrayList
ArrayList是Java集合框架中的一個(gè)類,它實(shí)現(xiàn)了List接口,基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),提供了動(dòng)態(tài)擴(kuò)展容量的功能。
動(dòng)態(tài)大小: 與 Java 中的數(shù)組不同,ArrayList 在添加或刪除元素時(shí)可以動(dòng)態(tài)調(diào)整大小。
泛型支持: ArrayList 支持泛型,這意味著您可以指定它將保存的元素類型。例如,您可以創(chuàng)建一個(gè)包含字符串、整數(shù)或自定義對(duì)象的 ArrayList。
從零開(kāi)始的索引: ArrayList 中的元素按從零開(kāi)始的索引存儲(chǔ),這意味著第一個(gè)元素位于索引 0,第二個(gè)位于索引 1,依此類推。
ArrayList提供了三種構(gòu)造方法:
無(wú)參構(gòu)造方法:創(chuàng)建一個(gè)初始容量為10的空列表。
ArrayList<E> list = new ArrayList<>();
源碼:
指定初始容量的構(gòu)造方法:創(chuàng)建一個(gè)具有指定初始容量的空列表。
ArrayList<E> list = new ArrayList<>(initialCapacity);
源碼:
從集合構(gòu)造(使用Collection構(gòu)造方法:):創(chuàng)建一個(gè)包含指定集合元素的列表
ArrayList<E> list = new ArrayList<>(Collection<? extends E> c);
Collection<? extends E> c 是一個(gè)泛型表達(dá)式,它表示一個(gè)集合,該集合包含的元素類型是 E 或者是 E 的某個(gè)子類型(或子類)。在這個(gè)表達(dá)式中,? extends E 表示任何是 E 類型或其子類型的通配符。這允許在集合中包含 E 或 E 的子類的元素。
源碼:
代碼演示:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Demo01 { public static void main(String[] args) { // 無(wú)參構(gòu)造方法 ArrayList<String> emptyList = new ArrayList<>(); // 帶初始容量的構(gòu)造方法 ArrayList<Integer> intListWithCapacity = new ArrayList<>(10); // 使用Collection構(gòu)造方法 ArrayList<String> list = Arrays.asList("小新","小葵"); ArrayList<String> arrayListFromCollection = new ArrayList<>(list); // 輸出結(jié)果 System.out.println("無(wú)參構(gòu)造集合: " + emptyList); System.out.println("帶初始容量的構(gòu)造集合: " + intListWithCapacity); System.out.println("使用Collection構(gòu)造集合: " + arrayListFromCollection); } }
運(yùn)行結(jié)果:
ArrayList核心方法
添加元素:
add(E element): 將元素添加到列表的末尾。
add(int index, E element): 在指定的索引位置插入元素。
獲取元素:
get(int index): 獲取指定索引位置的元素。
修改元素:
set(int index, E element): 替換指定索引位置的元素。
刪除元素:
remove(Object o): 從列表中刪除指定的元素。
remove(int index): 刪除指定索引位置的元素。
判斷是否包含元素:
contains(Object o): 判斷列表是否包含指定的元素。
獲取列表大?。?/strong>
size(): 返回列表中的元素?cái)?shù)。
判斷列表是否為空:
isEmpty(): 如果列表不包含任何元素,則返回 true。
清空列表:
clear(): 從列表中移除所有元素。
獲取元素下標(biāo):
indexOf(Object o): 返回指定元素第一次出現(xiàn)的索引;如果列表不包含該元素,則返回 -1。
lastIndexOf(Object o): 返回指定元素最后一次出現(xiàn)的索引;如果列表不包含該元素,則返回 -1。
轉(zhuǎn)換為數(shù)組:
toArray(): 將列表轉(zhuǎn)換為數(shù)組。
截取集合元素:subList(int fromIndex, int toIndex): 返回列表的子列表,[ fromIndex, toIndex)。
判斷內(nèi)容是否相等:
equals(Object o)
代碼演示:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Demo02 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); List<String> list1 = Arrays.asList("李白","高適","杜甫","杜甫","白居易","王維"); list.addAll(list); System.out.println("list集合中的元素為"+list); //int size() System.out.println("集合的元素的個(gè)數(shù)為:"+list.size()); //E get(int index)獲取下標(biāo)中的元素 System.out.println("首元素為:"+list.get(0)); System.out.println("尾元素為:"+list.get(list.size()-1)); //int intdexOf(Object C) System.out.println("元素杜甫的下標(biāo)位置為:"+list.indexOf("杜甫")); //boolean contains(Object c) System.out.println("元素杜甫是否存在:"+list.contains("杜甫")); //boolean isEmpty System.out.println("集合是否為空:"+list.isEmpty()); //List<E> subList(int fromIndex,int toIndex) List<String> subList = list.subList(0,list.size()); System.out.println("截取的集合元素為:"+subList); //boolean equals(Object o) System.out.println("內(nèi)容是否相等"+list.equals(subList)); } }
運(yùn)行結(jié)果:
2.什么是Linklist?
LinkList是一個(gè)雙向鏈表,它通過(guò)節(jié)點(diǎn)之間的鏈接來(lái)存儲(chǔ)數(shù)據(jù)。每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)和指向前后節(jié)點(diǎn)的引用。這種結(jié)構(gòu)使得LinkedList適合于頻繁的插入和刪除操作。
內(nèi)部結(jié)構(gòu)LinkedList的內(nèi)部結(jié)構(gòu)包括節(jié)點(diǎn)(Node)和鏈表(LinkedList類)。每個(gè)節(jié)點(diǎn)包含數(shù)據(jù)、前一個(gè)節(jié)點(diǎn)的引用和后一個(gè)節(jié)點(diǎn)的引用。這種結(jié)構(gòu)使得LinkedList既可以從頭部也可以從尾部進(jìn)行快速的插入和刪除操作。
LinkList提供兩種構(gòu)造方法:
無(wú)參構(gòu)造方法:
LinkedList<E> list = new LinkedList<>();
源碼:
從集合構(gòu)造(使用Collection構(gòu)造方法:):
LinkList<E> list = new LinkList<>(Collection<? extends E> c);
LinkList核心方法
代碼示例:
public class Demo07 { public static void main(String[] args) { //創(chuàng)建list1 LinkedList<String> list1 = new LinkedList<>(); //添加元素 list1.add("小白"); list1.add("小葵"); //add(int index,E element) 在此列表中的指定位置插入指定的元素。 list1.add(0,"小新"); boolean addAll(int index,Collection<?extendsE>c)添加一個(gè)單列集合,默認(rèn)添加到集合的尾部,如果傳入index,則放入指定位置 List<String> c1 = Arrays.asList("風(fēng)間","妮妮","阿呆"); list1.addAll(1,c1); //void addFirst(E,e)添加到列表的頭部 list1.addFirst("蜘蛛俠"); //void addLast(E e)添加到列表的尾部 list1.addLast("黑寡婦"); System.out.println("集合的內(nèi)容為:"+list1); //查看 String item1 = list1.get(0); System.out.println("首元素為:"+item1); System.out.println("首元素為:"+list1.getFirst()); System.out.println("尾元素為:"+list1.getLast()); System.out.println("元素個(gè)數(shù)為:"+list1.size()); //修改set(int index,Eelement):用指定的元素替代此列表中指定位置上的元素。 int index = list1.indexOf("小新"); list1.set(index,"野原新之助"); System.out.println("修改后的集合為:"+list1); //刪除方法 boolean b1 = list1.remove("小新"); System.out.println("刪除是否成功:"+b1); System.out.println("修改后的集合為:"+list1); String item = list1.remove(2); System.out.println("刪除元素為:"+item); System.out.println("修改后的集合為:"+list1); System.out.println("刪除的首元素為:"+list1.removeFirst()); System.out.println("刪除的尾元素為:"+list1.removeLast()); System.out.println("默認(rèn)刪除首元素:"+list1.remove()); } }
運(yùn)行結(jié)果:
3.ArrayList和LinkedList的區(qū)別:
ArrayList和LinkedList的主要區(qū)別在于它們的底層數(shù)據(jù)結(jié)構(gòu)、性能特點(diǎn)以及適用場(chǎng)景。
圖解:
底層數(shù)據(jù)結(jié)構(gòu)
- ArrayList:基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),維護(hù)一個(gè)Object類型的數(shù)組來(lái)存儲(chǔ)元素,可以根據(jù)需要自動(dòng)擴(kuò)展容量。當(dāng)元素?cái)?shù)量超過(guò)當(dāng)前容量時(shí),ArrayList會(huì)進(jìn)行擴(kuò)容操作,通常是將現(xiàn)有元素復(fù)制到一個(gè)新的更大數(shù)組中。
- LinkedList:基于雙向鏈表實(shí)現(xiàn),每個(gè)節(jié)點(diǎn)包含存儲(chǔ)的元素、指向前一個(gè)節(jié)點(diǎn)的引用和指向下一個(gè)節(jié)點(diǎn)的引用。LinkedList不需要預(yù)先分配固定大小的空間,可以在鏈表的頭部或尾部靈活地添加或刪除元素。
性能特點(diǎn)
------------------------------------------------------------------------------------------------------------------------------
查詢性能:ArrayList:通過(guò)索引直接訪問(wèn)元素,查詢速度非???,時(shí)間復(fù)雜度為O(1)。適合需要頻繁訪問(wèn)特定位置數(shù)據(jù)的場(chǎng)景。
LinkedList:需要遍歷鏈表來(lái)找到指定索引的元素,查詢速度較慢,時(shí)間復(fù)雜度為O(n)。
添加和刪除性能:ArrayList:在列表中間插入或刪除元素時(shí),需要移動(dòng)后續(xù)的所有元素,時(shí)間復(fù)雜度為O(n)。在列表末尾插入或刪除元素的時(shí)間復(fù)雜度為O(1),但擴(kuò)容時(shí)需要復(fù)制元素,時(shí)間復(fù)雜度較高。
LinkedList:在頭部或尾部添加或刪除元素時(shí),只需更改指針引用,時(shí)間復(fù)雜度為O(1)。在中間插入或刪除元素時(shí),時(shí)間復(fù)雜度為O(n),但如果已知節(jié)點(diǎn)位置,操作時(shí)間復(fù)雜度為O(1)。
適用場(chǎng)景ArrayList:適合需要頻繁訪問(wèn)特定位置數(shù)據(jù)的場(chǎng)景,如排行榜、購(gòu)物車列表等。由于其在中間插入或刪除元素的性能較差,更適合查詢多、增刪少的場(chǎng)景。
LinkedList:適合需要頻繁在列表頭部或尾部進(jìn)行插入和刪除操作的場(chǎng)景,如鏈表操作、隊(duì)列等。由于其內(nèi)部結(jié)構(gòu)特點(diǎn),更適合動(dòng)態(tài)增刪操作。
總結(jié)
到此這篇關(guān)于JAVA中ArrayList與LinkedList二者特點(diǎn)與區(qū)別總結(jié)的文章就介紹到這了,更多相關(guān)JAVA ArrayList與LinkedList內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Minio進(jìn)行文件存儲(chǔ)的實(shí)現(xiàn)
本文主要介紹了SpringBoot使用Minio進(jìn)行文件存儲(chǔ)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07mybatis連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)雙表查詢
本文主要介紹了mybatis連接數(shù)據(jù)庫(kù)實(shí)現(xiàn)雙表查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09java 實(shí)現(xiàn)通過(guò) post 方式提交json參數(shù)操作
這篇文章主要介紹了java 實(shí)現(xiàn)通過(guò) post 方式提交json參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09解決SpringBoot在IDEA中熱部署失效問(wèn)題
熱部署是指程序運(yùn)行過(guò)程中實(shí)時(shí)更新或替換其組件的技術(shù),即項(xiàng)目正在啟動(dòng)中,修改了配置文件中某個(gè)值或者添加了某個(gè)方法或者修改了某個(gè)方法參數(shù),本文給大家介紹了解決SpringBoot在IDEA中熱部署失效問(wèn)題,需要的朋友可以參考下2024-01-01spring-boot-maven-plugin未指定版本導(dǎo)致的編譯錯(cuò)誤問(wèn)題
這篇文章主要介紹了spring-boot-maven-plugin未指定版本導(dǎo)致的編譯錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Java實(shí)現(xiàn)快速排序算法可視化的示例代碼
快速排序算法通過(guò)多次比較和交換來(lái)實(shí)現(xiàn)排序,是對(duì)冒泡排序算法的一種改進(jìn)。本文將用Java語(yǔ)言實(shí)現(xiàn)快速排序算法并進(jìn)行可視化,感興趣的可以了解一下2022-08-08Java布隆過(guò)濾器的原理和實(shí)現(xiàn)分析
數(shù)組、鏈表、樹(shù)等數(shù)據(jù)結(jié)構(gòu)會(huì)存儲(chǔ)元素的內(nèi)容,一旦數(shù)據(jù)量過(guò)大,消耗的內(nèi)存也會(huì)呈現(xiàn)線性增長(zhǎng)所以布隆過(guò)濾器是為了解決數(shù)據(jù)量大的一種數(shù)據(jù)結(jié)構(gòu)。本文就來(lái)和大家詳細(xì)說(shuō)說(shuō)布隆過(guò)濾器的原理和實(shí)現(xiàn),感興趣的可以了解一下2022-10-10使用新版Maven-mvnd快速構(gòu)建項(xiàng)目
本文主要介紹了使用新版Maven-mvnd來(lái)快速構(gòu)建項(xiàng)目,相比于Maven,mvnd可以顯著提高構(gòu)建速度,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01SpringBoot中的聲明式事務(wù)+切面事務(wù)+編程式事務(wù)詳解
這篇文章主要介紹了SpringBoot中的聲明式事務(wù)+切面事務(wù)+編程式事務(wù)詳解,事務(wù)管理對(duì)于企業(yè)應(yīng)用來(lái)說(shuō)是至關(guān)重要的,當(dāng)出現(xiàn)異常情況時(shí),它也可以保證數(shù)據(jù)的一致性,需要的朋友可以參考下2023-08-08