1. 程式人生 > >常用的資料結構String、連結串列、Map、hashmap、hashtable區別

常用的資料結構String、連結串列、Map、hashmap、hashtable區別

1.字串陣列String與連結串列的區別
陣列靜態分配記憶體,連結串列動態分配記憶體;
陣列在記憶體中連續,連結串列不連續;
陣列元素在棧區,連結串列元素在堆區;
陣列利用下標定位,時間複雜度為O(1),連結串列定位元素時間複雜度O(n);
陣列插入或刪除元素的時間複雜度O(n),連結串列的時間複雜度O(1)。

2.map、hashmap、hashtable
第一、繼承的父類不同:Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap 類。但二者都實現了Map介面。

第二、執行緒安全性不同:Hashtable 中的方法是Synchronize的,而HashMap中的方法在預設情況下是非Synchronize的。在多執行緒併發的環境下,可以直接使用Hashtable,不需要自己為它的方法實現同步,但使用HashMap時就必須要自己增加同步處理。

第三、是否提供contains方法:HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因為contains方法容易讓人引起誤解。Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。

第四、key和value是否允許null值:其中key和value都是物件,並且不能包含重複key,但可以 包含重複的value。Hashtable中,key和value都不允許出現null值。HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,可能是 HashMap中沒有該鍵,也可能使該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵, 而應該用containsKey()方法來判斷。

第五、兩個遍歷方式的內部實現上不同:Hashtable、HashMap都使用了 Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。

第六、hash值不同:雜湊值的使用不同,HashTable直接使用物件的hashCode。而HashMap重新計算hash值。

第七、內部實現使用的陣列初始化和擴容方式不同:Hashtable和HashMap它們兩個內部實現方式的陣列的初始大小和擴容的方式。HashTable中hash陣列預設大小是11,增加的方式是 old*2+1。HashMap中hash陣列的預設大小是16,而且一定是2的指數。

3.list arraylist linkedlist vector的區別


ArrayList 是一個可改變大小的陣列.當更多的元素加入到ArrayList中時,其大小將會動態地增長.
內部的元素可以直接通過get與set方法進行訪問,因為ArrayList本質上就是一個數組.
LinkedList 是一個雙鏈表,在新增和刪除元素時具有比ArrayList更好的效能.但在get與set方面弱於ArrayList.
當然,這些對比都是指資料量很大或者操作很頻繁的情況下的對比,如果資料和運算量很小,那麼對比將失去意義.
Vector 和ArrayList類似,但屬於強同步類。如果你的程式本身是執行緒安全的(thread-safe,
沒有在多個執行緒之間共享同一個集合/物件),那麼使用ArrayList是更好的選擇。
Vector和ArrayList在更多元素新增進來時會請求更大的空間。Vector每次請求其大小的雙倍空間,而ArrayList每次對size增長50%.
而 LinkedList 還實現了 Queue 介面,該介面比List提供了更多的方法,包括 offer(),peek(),poll()等.

4.HashSet、TreeSet、LinkedHashSet的區別
Set介面:
Set不允許包含相同的元素,如果試圖把兩個相同元素加入同一個集合中,add方法返回false。
Set判斷兩個物件相同不是使用==運算子,而是根據equals方法。也就是說,只要兩個物件 用equals方法比較返回true,Set就不 會接受這兩個物件。
HashSet:
HashSet有以下特點
不能保證元素的排列順序,順序有可能發生變化
不是同步的
集合元素可以是null,但只能放入一個null
當向HashSet結合中存入一個元素時,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值,
然後根據 hashCode值來決定該物件在HashSet中儲存位置。
簡單的說,HashSet集合判斷兩個元素相等的標準是兩個物件通過equals方法比較相等,並且兩個物件的hashCode()方法返回值相等
注意,如果要把一個物件放入HashSet中,重寫該物件對應類的equals方法,也應該重寫其hashCode()方法。
其規則是如果兩個對 象通過equals方法比較返回true時,其hashCode也應該相同。另外,物件中用作equals比較標準的屬性,都應該用來計算 hashCode的值。
LinkedHashSet:
LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的儲存位置,但是它同時使用連結串列維護元素的次序。
這樣使得元素看起 來像是以插入順序儲存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的新增順序訪問集合的元素。
LinkedHashSet在迭代訪問Set中的全部元素時,效能比HashSet好,但是插入時效能稍微遜色於HashSet。
TreeSet類:
TreeSet是SortedSet介面的唯一實現類,TreeSet可以確保集合元素處於排序狀態。TreeSet支援兩種排序方式,自然排序 和定製排序,
其中自然排序為預設的排序方式。向TreeSet中加入的應該是同一個類的物件。
TreeSet判斷兩個物件不相等的方式是兩個物件通過equals方法返回false,或者通過CompareTo方法比較沒有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關係,然後將元素按照升序排列。
Java提供了一個Comparable介面,該接口裡定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該介面的物件就可以比較大小。
obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個物件相等,如果返回一個正數,則表明obj1大於obj2,如果是 負數,則表明obj1小於obj2。
如果我們將兩個物件的equals方法總是返回true,則這兩個物件的compareTo方法返回應該返回0
定製排序:自然排序是根據集合元素的大小,以升序排列,如果要定製排序,應該使用Comparator介面,實現 int compare(T o1,T o2)方法.