java容器總結

2021-07-11 16:39:30 字數 1601 閱讀 3368

容器大體分為兩類:collection和map。

區別:

1 collection中儲存了一組物件,而map儲存鍵值對。

2 collection的子類都實現了iterator這個方法,該方法能返回乙個iterator物件。

collection的具體實現包括list和set。

區別:

1 list是有序的,元素可以重複的,set是無序的,元素不可以重複。

2 set的value最多只能存乙個null。

list的具體實現包括linkedlist,arraylist,vector和stack。

區別:

1 linkedlist底層是通過鍊錶實現的,所以在中間插入快,但是定位查詢慢,是非執行緒安全的。

2 arraylist底層是通過陣列實現的,所以在中間插入慢,但是定位查詢快。

3 vector底層也是陣列,可以理解為執行緒安全的arraylist。

4 stack是後進先出(lifo)的資料結構,是棧。

set的具體實現包括hashset,linkedhashset,treeset,enumset。

區別:

1 hashset 集合存入元素時,會呼叫該物件的hashcode()方法得到hashcode值,根據hashcode值決定物件在hashset中儲存的位置,如有兩個元素通過equals方法比較返回true,但它們的hashcode不同,hashset會把它們儲存在不同位置,也就可以新增成功。

2 linkhashset 比hashset 多了乙個插入元素時維護元素次序的鍊錶,這樣使得元素看起來是以插入的順序儲存,也就是說在遍歷linkhashset時,將會按元素新增的順序訪問集合裡的元素,因此它在插入元素時效能比hashset略低,但在遍歷時效能比hashset高,因為它以鍊錶來維護內部順序。

3 treeset是sortedset介面的唯一實現,可以確保元素處於排序狀態。

4 enumset是乙個專門為列舉類設計的集合類,其中所有元素都必須是指定列舉型別的列舉值,該列舉值型別在建立enumset時顯式或隱式地指定。其集合元素也是有序的,其以列舉值在enum類內定義的順序來決定集合元素的順序。

map的實現類包括hashtable,hashmap,weakhashmap。

區別:

1 hashmap底層是陣列加鍊表,是非執行緒安全的。

2 hashtable底層是陣列加鍊表,是執行緒安全的。

3 weakhashmap是一種改進的hashmap,它對key實行弱引用,如果乙個key不再被外部引用,那麼該key可以被**。

總結:

1 如果涉及到堆疊,佇列等操作,應該考慮用list,對於需要快速插入,刪除元素,應該使用linkedlist,如果需要快速隨機訪問元素,應該使用arraylist。

2 如果程式在單執行緒環境中,或者訪問僅僅在乙個執行緒中進行,考慮非同步的類,其效率較高,如果多個執行緒可能同事操作乙個類,應該使用同步的類。

3 要特別注意雜湊表的操作,作為key的物件要正確複寫equals和hashcode方法。

4 盡量返回介面而非實際的型別,如返回list而非arraylist,這樣如果以後將arraylist換成linkedlist時,客戶端**不用改變。這就是針對抽象程式設計。

Java併發容器

同步容器將所有容器狀態的訪問都序列化,以實現執行緒安全性。這種方式的代價會嚴重降低併發性,多個執行緒競爭容器的鎖時,吞吐量將嚴重降低。併發容器是針對多個執行緒併發訪問設計的。通過併發容器來代替同步容器,可以極大地提高伸縮性並降低風險。與hashmap一樣,concurrenhashmap也是乙個基於...

java併發容器

一 同步容器都是執行緒安全的 如vector 和 hashtable collections.synchronized 實現執行緒安全的是通過,將它們的狀態封裝起來,並對每個公有方法都進行同步。但在一些復合操作時,還是要加鎖來保護復合操作。在容器在迭代過程中被修改時,會拋異常 二 併發容器可以改進一...

Java容器(Java複習一)

lru與lfu set 無序的,唯一的 hashmap在jdk1.7的資料結構是hash表 鍊錶,而在jdk1.8中做了優化,當鍊表長度達到8時,將鍊錶轉換為紅黑樹進行儲存。如下圖 插入值的操作 首先計算key值的hash值,得到的計算結果為陣列下標在hashtable中查詢,檢視對應位置是否有值,...