當前位置:成語大全網 - 書法字典 - Java中五個最常用的集合類之間的區別和聯系

Java中五個最常用的集合類之間的區別和聯系

有幾種常用的集合類:

列表結構的集合類:ArrayList類、LinkedList類、Vector類和Stack類。

Map結構的集合類:HashMap類、Hashtable類。

集合結構的集合類:HashSet類、TreeSet類。

隊列結構集合:隊列接口

哈希表和哈希表的區別:

HashMap和Hashtable都是java的集合類,可以用來存儲java對象。這是他們的相似之處。

以下是他們的不同之處:

1.歷史原因:

Hashtable基於過時的Dictionary類,HashMap是java 1.2引入的Map接口的現實。

2.同步:

Hashtable是同步的,這個類中的壹些方法確保Hashtable中的對象是線程安全的,而HashMap是異步的,所以HashMap中的對象不是線程安全的,因為同步的要求會影響執行的效率,所以如果不需要線程安全的組合,使用HashMap是壹個不錯的選擇,這樣可以避免同步帶來的不必要的性能開銷,提高效率。壹般來說,我們編寫的程序是異步的。

3.價值:

HashMap允許使用空值作為表條目的鍵或值。

哈希表不能與null壹起放置。

數組列表和Vector的區別:

ArrayList和Vector都是java的集合類,用於存儲java對象。這是他們的相似之處。

差異:

1.同步:

Vector是同步的,這個類的壹些方法保證了Vector中對象的線程安全,而ArrayList是異步的,所以ArrayList中的對象不是線程安全的,因為同步要求會影響執行的效率,所以不需要線程安全的集合,所以使用ArrayList是壹個不錯的選擇,這樣可以避免同步帶來的不必要的性能開銷。

2.數據增長:

從內部實現機制來看,ArrayList和Vector都使用數組來控制集合中的對象。當您向這兩種類型添加元素時,如果元素的數量超過了內部數組的當前長度,則它們都需要擴展內部數組的長度。默認情況下,Vector自動將原始數組長度增加壹倍,ArrayList是原始長度的50%。所以最終,妳得到的集合總是比妳實際需要的空間占用得更多,所以如果妳想在集合中保存大量數據,那麽使用Vector有壹些優勢,因為妳可以通過設置集合的初始大小來避免不必要的資源開銷。

總結:

1)如果需要線程安全,請使用Vector,Hashtable。

2)如果不需要線程安全,請使用ArrayList、LinkedList和HashMap。

3)如果需要鍵值對,請使用HashMap,Hashtable。

4)如果數據量很大,線程安全需要考慮Vector。

1.ArrayList:單元素,效率高,多用於查詢。

2.向量:單個元素,線程安全,主要用於查詢。

3.鏈表:單個元素,主要用於插入和刪除。

4.HashMap:元素是成對的,元素可以是空的。

5.Hashtable:元素是成對的,線程是安全的,元素不能為空。

數組列表

底層是對象數組,所以ArrayList的優點是查詢速度快,增刪速度慢。

LinkedList的底部是壹個雙向循環鏈表。這個鏈表上的每個數據節點由三部分組成:前指針(指向前壹個節點的位置)、數據和後指針(指向後壹個節點的位置)。最後壹個節點的後指針指向第壹個節點的前指針,形成壹個循環。

雙向循環鏈表的查詢效率較低,但增刪效率高。

ArrayList和LinkedList在用法上沒有區別,但在功能上還是有區別的。

鏈接列表

當有許多添加和刪除操作但查詢操作很少時,通常使用它:隊列和堆棧。

隊列:先進先出的數據結構。

堆棧:後進先出數據結構。

註意:當使用堆棧時,您不能提供壹種方法來獲取不是堆棧中最後壹個元素的元素。

矢量

(類似於ArrayList,不同的是Vector是壹個重量級組件,它消耗更多的資源。)

結論:在考慮並發時使用向量(以確保線程安全)。

使用ArrayList時不考慮並發性(線程安全無法保證)。

面試經歷(知識點):

java.util.stack的父類是Vector。但是stack的父類不應該是Vector。因為Vector的底部是壹個數組,並且Vector有壹個get方法(這意味著它可能會訪問不屬於最後壹個position元素的其他元素,這是非常不安全的)。

只有push和get類可以用於堆棧和隊列。

以後不要輕易使用Stack類。

實現堆棧必須使用LinkedList。

(在JAVA1.5中,集合有壹個隊列來實現隊列。)

Set-HashSet實現類:

遍歷集合只有壹種方法:interator。

HashSet中的元素是無序的(這種無序是指添加數據的順序與後面排列的順序不同),並且元素不可重復。

對象中有finalize()、toString()、equals()和hashCode()。

HashSet在底層也使用數組。

使用add(Object o)將對象添加到數組時,系統首先查找對象的hashCode:

int HC = o . hashcode();返回的hashCode是壹個整數值。

int I = HC % n;(n是數組的長度)。獲得余數後,使用余數將數據添加到數組中的相應位置。以n為6為例。如果I=0,它將被放在數組a【0】的位置。如果I=1,它將被放在數組a【1】的位置。如果equals()返回的值為true,則數據是重復的。如果equals()返回的值為false,則尋找另壹個位置進行比較。這種機制使得兩個相同的對象可以重復添加到數組中,因為它們的hashCode不同。

如果我們可以讓兩個相同的對象具有相同的hashcode,我們就可以在equals()中返回true。

在該實例中,當定義student對象時,它會覆蓋其hashcode。

因為string類會被自動覆蓋,所以在比較String類的對象時,不會有兩個相同的String對象。

現在,在大多數JDK,哈希碼已被要求涵蓋。

結論:如果用戶定義的類使用hashSet來添加對象,則有必要重寫hashcode()和equals()。覆蓋的原則是確保當兩個對象返回相同的整數時,equals()的返回值為True。

如果妳很懶,沒有設置equals(),妳將返回hashCode。雖然結果是壹樣的,但是妳會在程序執行過程中多次調用equals(),這會影響程序執行的效率。