java中ArrayList和LinkedList的區(qū)別詳解
ArrayList和LinkedList都實現(xiàn)了List接口,有以下的不同點:
1、ArrayList是基于索引的數(shù)據(jù)接口,它的底層是數(shù)組。它可以以O(shè)(1)時間復(fù)雜度對元素進(jìn)行隨機(jī)訪問。與此對應(yīng),LinkedList是以元素列表的形式存儲它的數(shù)據(jù),每一個元素都和它的前一個和后一個元素鏈接在一起,在這種情況下,查找某個元素的時間復(fù)雜度是O(n)。
2、相對于ArrayList,LinkedList的插入,添加,刪除操作速度更快,因為當(dāng)元素被添加到集合任意位置的時候,不需要像數(shù)組那樣重新計算大小或者是更新索引。
3、LinkedList比ArrayList更占內(nèi)存,因為LinkedList為每一個節(jié)點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。
ArrayList擴(kuò)容:
總的來說就是分兩步:
1、擴(kuò)容
把原來的數(shù)組復(fù)制到另一個內(nèi)存空間更大的數(shù)組中
2、添加元素
把新元素添加到擴(kuò)容以后的數(shù)組中
無參構(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);
}
}
在無參構(gòu)造中,我們看到了在用無參構(gòu)造來創(chuàng)建對象的時候其實就是創(chuàng)建了一個空數(shù)組,長度為0
在有參構(gòu)造中,傳入的參數(shù)是正整數(shù)就按照傳入的參數(shù)來確定創(chuàng)建數(shù)組的大小,否則異常
接下來我們來看擴(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)算符 原來長度的一半 再加上原長度也就是每次擴(kuò)容是原來的1.5倍
之前的所有都是確定新數(shù)組的長度,確定之后就是把老數(shù)組copy到新數(shù)組中,這樣數(shù)組的擴(kuò)容就結(jié)束了
以上的一切都是ArrayList擴(kuò)容的第一步,第二步就沒啥說的了,就是把需要添加的元素添加到數(shù)組的最后一位
以上就是java中ArrayList和LinkedList的區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于java ArrayList和LinkedList的區(qū)別的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring實戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作示例
這篇文章主要介紹了Spring實戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作,結(jié)合實例形式分析了靜態(tài)工廠方法創(chuàng)建Bean的相關(guān)實現(xiàn)步驟與操作注意事項,需要的朋友可以參考下2019-11-11
SpringBoot項目Jar包如何瘦身部署的實現(xiàn)
這篇文章主要介紹了SpringBoot項目Jar包如何瘦身部署的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Spring超詳細(xì)講解事務(wù)和事務(wù)傳播機(jī)制
Spring事務(wù)的本質(zhì)就是對數(shù)據(jù)庫事務(wù)的支持,沒有數(shù)據(jù)庫事務(wù),Spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一的事務(wù)管理接口,具體實現(xiàn)都是由數(shù)據(jù)庫自己實現(xiàn)的,Spring會在事務(wù)開始時,根據(jù)當(dāng)前設(shè)置的隔離級別,調(diào)整數(shù)據(jù)庫的隔離級別,由此保持一致2022-06-06
Java的Lambda表達(dá)式和Stream流的作用以及示例
這篇文章主要介紹了Java的Lambda表達(dá)式和Stream流簡單示例,Lambda允許把函數(shù)作為一個方法的參數(shù),使用Lambda表達(dá)式可以寫出更簡潔、更靈活的代碼,而其作為一種更緊湊的代碼風(fēng)格,使Java的語言表達(dá)能力得到了提升,需要的朋友可以參考下2023-05-05
Spring Boot使用profile如何配置不同環(huán)境的配置文件
,springboot支持通過不同的profile來配置不同環(huán)境的配置,下面就大致介紹一下yml配置文件跟properties配置文件怎么使用profile配置不同環(huán)境的配置文件2018-01-01
Java Apollo環(huán)境搭建以及集成SpringBoot案例詳解
這篇文章主要介紹了Java Apollo環(huán)境搭建以及集成SpringBoot案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

