ArrayList 和 Set的底層詳細介紹

2021-10-07 16:32:19 字數 2019 閱讀 9525

arraylist

特點:list介面的主要實現類,執行緒是不安全的,效率高

資料結構:arraylist的底層資料結構就是乙個陣列,陣列元素的型別為object型別,對arraylist的所有操作底層都是基於陣列的。

執行緒安全性:對arraylist進行新增元素的操作的時候是分兩個步驟進行的,即第一步先在object[size]的位置上存放需要新增的元素;第二步將size的值增加1。由於這個過程在多執行緒的環境下是不能保證具有原子性的,因此arraylist在多執行緒的環境下是執行緒不安全的。

如果非要在多執行緒的環境下使用arraylist,就需要保證它的執行緒安全性,通常有兩種解決辦法:第一,使用synchronized關鍵字;第二,可以用collections類中的靜態方法synchronizedlist();對arraylist進行呼叫即可。

原始碼分析:jdk7情況下

arraylist list = new arraylist();//建立了長度為10的object陣列elementdata

list.add(123);

...list.add(456);//如果此次的新增導致底層elementdata陣列容量不夠,則擴容。預設情況下,擴容為原來容量的1.5倍,同時需要將原來陣列中的資料複製到新的陣列中去。

原始碼分析:jdk8情況下

arraylist list = new arraylist();//底層object elementdata初始化為{},沒有建立長度為10的陣列

list.add(123);//第一次呼叫add()時,底層才建立了長度為10的陣列,並將資料123新增到elementdata陣列中

//後續的新增和擴容操作與jdk7一樣

elementdata儲存:

linkedlist:對於頻繁的插入刪除操作,使用此類效率比arraylist高,底層使用雙向鍊錶儲存。

vector:作為list介面的古老實現類;執行緒安全的,效率低;底層使用object elementdata儲存

一、set:儲存無序的,不可重複的資料

以hashset為例說明:

1.無序性:不等於隨機性。儲存的資料在底層陣列中並非按照陣列索引的順序新增,而是根據資料的雜湊值決定。

2.不可重複性: 保證新增的元素按照equal()判斷時,不能返回true。即:相同的元素只能新增乙個。

二、新增元素的過程:以hashsete為例

我們向hashset中新增元素a,首先呼叫元素a所在類的hashcode()方法,計算a的雜湊值,此雜湊值接著通過某種方法計算出在hashset底層陣列中的存放位置(即為索引位置),判斷陣列此位置上是否已經有元素:

(1)如果此位置上沒有其它元素,則元素a新增成功。 --->情況1

(2)如果此位置上有其它元素b(或以鍊錶形式存在的多個元素),則比較元素a和元素b的hash值:

如果雜湊值不同,則元素a新增成功。--->情況2

如果雜湊值相同,進而需要呼叫元素a所在類的equal()方法,equal()返回true,元素a新增失敗,返回false,則元素新增成功。--->情況3

對於新增成功的情況2和情況3而言:元素a與已經存放在指定索引位置上資料以鍊錶的方式儲存。

jdk7:元素a放到陣列中,指向原來的元素

jdk8:原來的元素在陣列中,指向元素a

set介面中沒有額外定義新的方法,使用的都是collection中宣告過的方法。

linkedhashset:作為hashset的子類;遍歷其內部資料時,可以按照新增的順序遍歷,對於頻繁的遍歷操作,linkedhashset效率高於hashset.

treeset

新增資料的時候,必須是相同類的物件 ;

1.自然排序中,比較兩個物件是否相同的標準為:compareto()返回0.不再是equals().

2.定製排序中,比較兩個物件是否相同的標準為:compare()返回0.不再是equal()

Array List和ArrayList的區別與

定義 public abstract class array icloneable,ilist,icollection,ienumerable,istructuralcomparable,istructuraequatable 陣列在記憶體中是連續儲存的,所以它的索引速度是非常的快,而且賦值與修改元...

ArrayList和Hashtable的有關內容

arraylist的內容 陣列列表的特點 可變長度,用法和陣列類似 屬性 count 得到集合中的實際存放資料的個數 arrylist 動態陣列 方法 add 向陣列中新增乙個元素 remove 刪除陣列中的某一元素 removeat 刪除陣列中索引值為i的元素 revese 反轉陣列的元素 sor...

LinkedList和ArrayList的區別

對於集合collection下的list介面,有兩個實現類,arraylist和linkedlist,那麼他們兩個有什麼區別呢。arraylist的底層由陣列實現,而linkedlist的底層由雙向鍊錶實現,底層的不同才是他們區別的根源。然而因為他們繼承於同乙個父介面,他們的很多方法都是相同的。關於...