java集合詳解

2021-09-14 00:36:57 字數 3167 閱讀 1710

1、vector、arraylist都是以類似陣列的形式儲存在記憶體中,linkedlist則以鍊錶的形式進行儲存。

2、list中的元素有序、允許有重複的元素,set中的元素無序、不允許有重複元素。

3、vector執行緒同步,arraylist、linkedlist執行緒不同步。

4、linkedlist適合指定位置插入、刪除操作,不適合查詢,因為要移動指標;arraylist、vector適合查詢,不適合指定位置的插入、刪除操作,因為要移動資料。

5、arraylist在元素填滿容器時會自動擴充容器大小的50%,而vector則是100%,因此arraylist更節省空間。

1、hashtable執行緒同步,hashmap非執行緒同步。

2、hashtable不允許《鍵,值》有空值,hashmap允許《鍵,值》有空值。

3、hashtable使用enumeration,hashmap使用iterator。

4、hashtable中hash陣列的預設大小是11,增加方式的old*2+1,hashmap中hash陣列的預設大小是16,增長方式一定是2的指數倍。

5、linkedhashmap儲存了記錄的插入順序,在用iterator遍歷linkedhashmap時,先得到的記錄肯定是先插入的.也可以在構造時用帶引數,按照應用次數排序。在遍歷的時候會比hashmap慢,不過有種情況例外,當hashmap容量很大,實際資料較少時,遍歷起來可能會比linkedhashmap慢,因為linkedhashmap的遍歷速度只和實際資料有關,和容量無關,而hashmap的遍歷速度和他的容量有關。

6、treemap(本質就是一顆紅黑樹,演算法參考:實現sortmap介面,能夠把它儲存的記錄根據鍵排序,預設是按鍵值的公升序排序,也可以指定排序的比較器,當用iterator 遍歷treemap時,得到的記錄是排過序的。

treemap 例項

public static void main(string args)

}另外說明

hashset是通過hashmap實現的,treeset是通過treemap實現的,只不過set用的只是map的key

map的key和set都有乙個共同的特性就是集合的唯一性.treemap更是多了乙個排序的功能.

hashcode和equal()是hashmap用的, 因為無需排序所以只需要關注定位和唯一性即可.

a. hashcode是用來計算hash值的,hash值是用來確定hash表索引的.

b. hash表中的乙個索引處存放的是一張鍊錶, 所以還要通過equal方法迴圈比較鏈上的每乙個物件

才可以真正定位到鍵值對應的entry.

c. put時,如果hash表中沒定位到,就在鍊錶前加乙個entry,如果定位到了,則更換entry中的value,並返回舊value

由於treemap需要排序,所以需要乙個comparator為鍵值進行大小比較.當然也是用comparator定位的.

a. comparator可以在建立treemap時指定

b. 如果建立時沒有確定,那麼就會使用key.compareto()方法,這就要求key必須實現comparable介面.

c. treemap是使用tree資料結構實現的,所以使用compare介面就可以完成定位了.

hashmap:執行緒不安全的。

hashtable:鎖住整張hash表,讓執行緒獨佔。hashmap允許為空。通過分析hashtable就知道,synchronized是針對整張hash表的,即每次鎖住整張表

讓執行緒獨佔,安全的背後是巨大的浪費。

concurrenthashmap:乙個更快的hashmap,它提供了好得多的併發性。多個讀操作幾乎總可以併發地執行。他是鎖段(預設:把hash表分為16個

段),在get,put,remove等操作中,concurrenthashmap只鎖定當前需要用到的段,只有在求size的時候才鎖定整張hash表。

linkedlist底層的資料結構是基於雙向迴圈鍊錶的,且頭結點中不存放資料。乙個節點例項裡面儲存業務資料,前乙個節點的位置資訊和後乙個節點位置資訊。

1、hashmap實際上是乙個陣列,陣列裡面的每個元素都是乙個鍊錶(jdk8以後是tree)。每個元素在通過put方法放入hashmap中的時候,要按照如下步驟進行:

a.根據該元素自身提供的hashcode計算出雜湊值,該雜湊值就是陣列的下標

b.將新元素放入該陣列位置的鍊錶中

既然是乙個陣列,總有數目上限,也就意味著如果存入hashmap的元素太多,導致陣列大小不能夠存放所有的鍊錶的時候,陣列大小必須要能夠調整。

2、entry是什麼型別?

這是乙個hashmap類的內部靜態類。實現了map.entry介面。接受兩個模板引數k和v。key和hash一旦在建構函式中被初始化,就不可改變,並且由於有next的存在,entry可以構成乙個單向鍊錶。

3、hashmap 包含如下幾個構造器:

hashmap():構建乙個初始容量為 16,負載因子為 0.75 的 hashmap。

ashmap(int initialcapacity):構建乙個初始容量為 initialcapacity,負載因子為 0.75 的 hashmap。

hashmap(int initialcapacity, float loadfactor):以指定初始容量、指定的負載因子建立乙個 hashmap。

hashmap的基礎構造器hashmap(int initialcapacity, float loadfactor)帶有兩個引數,它們是初始容量initialcapacity和負載因子loadfactor。

負載因子loadfactor衡量的是乙個雜湊表的空間的使用程度,負載因子越大表示雜湊表的裝填程度越高,反之愈小。對於使用鍊錶法的雜湊表來說,查詢乙個元素的平均時間是o(1+a),因此如果負載因子越大,對空間的利用更充分,然而後果是查詢效率的降低;如果負載因子太小,那麼雜湊表的資料將過於稀疏,對空間造成嚴重浪費。

4、hashmap的實現中,通過threshold欄位來判斷hashmap的最大容量:

threshold = (int)(capacity * loadfactor);

結合負載因子的定義公式可知,threshold就是在此loadfactor和capacity對應下允許的最大元素數目,超過這個數目就重新resize,以降低實的負載因子。預設的的負際載因子0.75是對空間和時間效率的乙個平衡選擇。當容量超出此最大容量時, resize後的hashmap容量是原來容量的兩倍.

能,重寫了該類的hashcode()方法和它的equals()

Java 集合類詳解

上述類圖中,實線邊框的是實現類,比如arraylist,linkedlist,hashmap等,折線邊框的是抽象類,比如abstractcollection,abstractlist,abstractmap等,而點線邊框的是介面,比如collection,iterator,list等。發現乙個特點,...

Java集合類詳解

陣列 只能存放基本資料型別,長度固定,不適合在資料未定的情況下使用 集合 存放物件,長度可變,功能強大 jdk 中 主要的集合類分為兩種 collection 和 map 集合類框架圖如下 主要分為 collection和map兩大類 collection介面是集合類中的一種基類,jdk中並沒有它的...

java集合框架詳解

集合的特點 乙個陣列中只能儲存同一資料型別,乙個集合中可以儲存不同資料型別的資料,集合用於儲存多個物件。陣列是固定長度,集合是可變長度。集合中不可以儲存基本資料型別值,陣列可以。集合框架體系圖 collection集合 具有的方法 boolean add e e 新增元素 boolean addal...