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的底層由雙向鍊錶實現,底層的不同才是他們區別的根源。然而因為他們繼承於同乙個父介面,他們的很多方法都是相同的。關於...