java中ArrayList和LinkedList的區(qū)別詳解
ArrayList和LinkedList都實(shí)現(xiàn)了List接口,有以下的不同點(diǎn):
1、ArrayList是基于索引的數(shù)據(jù)接口,它的底層是數(shù)組。它可以以O(shè)(1)時(shí)間復(fù)雜度對(duì)元素進(jìn)行隨機(jī)訪問(wèn)。與此對(duì)應(yīng),LinkedList是以元素列表的形式存儲(chǔ)它的數(shù)據(jù),每一個(gè)元素都和它的前一個(gè)和后一個(gè)元素鏈接在一起,在這種情況下,查找某個(gè)元素的時(shí)間復(fù)雜度是O(n)。
2、相對(duì)于ArrayList,LinkedList的插入,添加,刪除操作速度更快,因?yàn)楫?dāng)元素被添加到集合任意位置的時(shí)候,不需要像數(shù)組那樣重新計(jì)算大小或者是更新索引。
3、LinkedList比ArrayList更占內(nèi)存,因?yàn)長(zhǎng)inkedList為每一個(gè)節(jié)點(diǎn)存儲(chǔ)了兩個(gè)引用,一個(gè)指向前一個(gè)元素,一個(gè)指向下一個(gè)元素。
ArrayList擴(kuò)容:
總的來(lái)說(shuō)就是分兩步:
1、擴(kuò)容
把原來(lái)的數(shù)組復(fù)制到另一個(gè)內(nèi)存空間更大的數(shù)組中
2、添加元素
把新元素添加到擴(kuò)容以后的數(shù)組中
無(wú)參構(gòu)造:
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
帶參構(gòu)造:
public ArrayList(int initialCapacity) { if (initialCapacity >0) { this.elementData =new Object[initialCapacity]; }else if (initialCapacity ==0) { this.elementData = EMPTY_ELEMENTDATA; }else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }
在無(wú)參構(gòu)造中,我們看到了在用無(wú)參構(gòu)造來(lái)創(chuàng)建對(duì)象的時(shí)候其實(shí)就是創(chuàng)建了一個(gè)空數(shù)組,長(zhǎng)度為0
在有參構(gòu)造中,傳入的參數(shù)是正整數(shù)就按照傳入的參數(shù)來(lái)確定創(chuàng)建數(shù)組的大小,否則異常
接下來(lái)我們來(lái)看擴(kuò)容,擴(kuò)容的方法就是 add(E e)
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); }
private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; }
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); }
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
int newCapacity = oldCapacity + (oldCapacity >> 1);
oldCapacity >> 1 右移運(yùn)算符 原來(lái)長(zhǎng)度的一半 再加上原長(zhǎng)度也就是每次擴(kuò)容是原來(lái)的1.5倍
之前的所有都是確定新數(shù)組的長(zhǎng)度,確定之后就是把老數(shù)組copy到新數(shù)組中,這樣數(shù)組的擴(kuò)容就結(jié)束了
以上的一切都是ArrayList擴(kuò)容的第一步,第二步就沒(méi)啥說(shuō)的了,就是把需要添加的元素添加到數(shù)組的最后一位
以上就是java中ArrayList和LinkedList的區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于java ArrayList和LinkedList的區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 淺談 java中ArrayList、Vector、LinkedList的區(qū)別聯(lián)系
- 淺析 ArrayList 和 LinkedList 有什么區(qū)別
- ArrayList和LinkedList區(qū)別及使用場(chǎng)景代碼解析
- Java中ArrayList和LinkedList之間的區(qū)別_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java面試崗常見(jiàn)問(wèn)題之ArrayList和LinkedList的區(qū)別
- Java ArrayList與LinkedList及HashMap容器的用法區(qū)別
- Java中ArrayList和LinkedList的區(qū)別
- Java中ArrayList和LinkedList區(qū)別
- ArrayList與linkedList的用法區(qū)別及擴(kuò)容方式
- Java中ArrayList和LinkedList有什么區(qū)別舉例詳解
相關(guān)文章
springboot整合jsp,實(shí)現(xiàn)公交車站路線圖
這篇文章主要介紹了springboot整合jsp,實(shí)現(xiàn)公交車站路線圖的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2021-01-01詳解java調(diào)用存儲(chǔ)過(guò)程并封裝成map
這篇文章主要介紹了詳解java調(diào)用存儲(chǔ)過(guò)程并封裝成map的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09mybatis 使用jdbc.properties文件設(shè)置不起作用的解決方法
這篇文章主要介紹了mybatis 使用jdbc.properties文件設(shè)置不起作用的解決方法,需要的朋友可以參考下2018-03-03使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改
最近項(xiàng)目需要在JPA中使用ID進(jìn)行批量更新,所以下面這篇文章主要給大家介紹了關(guān)于使用SpringBoot和JPA實(shí)現(xiàn)批量處理新增、修改的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06Java字符串拼接+和StringBuilder的比較與選擇
Java 提供了兩種主要的方式:使用 "+" 運(yùn)算符和使用 StringBuilder 類,本文主要介紹了Java字符串拼接+和StringBuilder的比較與選擇,感興趣的可以了解一下2023-10-10Maven倉(cāng)庫(kù)加載順序的實(shí)例解析
Maven倉(cāng)庫(kù)一般分為本地倉(cāng)庫(kù)和遠(yuǎn)程倉(cāng)庫(kù)。那么在實(shí)際開發(fā)中,在配置了多個(gè)倉(cāng)庫(kù)的情況下,他們之間的加載訪問(wèn)順序是怎么樣的呢,本文就詳細(xì)的來(lái)介紹一下2021-12-12java中Lambda常用場(chǎng)景代碼實(shí)例
這篇文章主要介紹了java中Lambda常用場(chǎng)景,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Java concurrency之非公平鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本篇文章主要介紹了Java concurrency之非公平鎖,詳細(xì)的介紹了獲取和釋放非公平鎖,有興趣的同學(xué)可以了解一下2017-06-06