Collection和map的區別
1、Collection是最基本的集合介面,一個Collection代表一組Object,即Collection的元素(Elements)。
一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。
Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子介面”如List和Set。
2、所有實現Collection介面的類都必須提供兩個標準的建構函式:無引數的建構函式和有一個Collection引數的建構函式
其中無引數的建構函式用於建立一個空的Collection;有一個Collection引數的建構函式用於建立一個新的Collection。
List介面:
1、List是有序的Collection,使用此介面能準確的鎖定每個元素的位置,可以通過索引訪問List中的元素,類似於java陣列。
2、List中是允許存在相同的元素的。
3、List除了具有Collection介面必備的iterator()方法外,List還提供一個listIterator()方法,返回一個ListIterator()介面,
和標準的Iterator介面相比,ListIterator多了一些add()之類的方法,允許新增,刪除,設定元素,還能向前或向後遍歷。
4、實現List介面的常用類有LinkedList,ArrayList,Vector和Stack。
Set介面:
1、Set就一種不包含重複元素的Collection,即任意的兩個元素都不相等,Set最多有一個null元素。
繼承Map的類有HashMap,HashTable
Collection和Map介面之間的主要區別在於:Collection中儲存了一組物件,而Map儲存關鍵字/值對,即。
Map:
1、Map物件中,每一個關鍵字最多有一個關聯的值。
2、不能包括兩個相同的鍵,一個鍵最多能繫結一個值。null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。
3、當get()方法返回null值時,即可以表示Map中沒有該鍵,也可以表示該鍵所對應的值為null。
因此,在Map中不能由get()方法來判斷Map中是否存在某個鍵,而應該用containsKey()方法來判斷。
4、Map介面提供3種集合的檢視,Map的內容可以被當作一組key集合,一組value集合,或者一組key-value對映。
HashTable:
1、Dictionary的子類,預設是執行緒同步的。不允許關鍵字或值為null
2、實現一個Key-value對映的雜湊表。任何非空的物件都可以作為key或者value
HashMap:
1、Map的實現類,預設情況下是非同步的,可以通過Map Collections.synchronizedMap(Map m)來達到執行緒同步
2、允許null,即null value和null key。
當元素的順序很重要時選用TreeMap,當元素不必以特定的順序進行儲存時,使用HashMap。
Hashtable的使用不被推薦,因為HashMap提供了所有類似的功能,並且速度更快。
當你需要在多執行緒環境下使用時,HashMap也可以轉換為同步的。
如果涉及到堆疊,佇列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。
如果程式在單執行緒環境中,或者訪問僅僅在一個執行緒中進行,考慮非同步的類,其效率較高,如果多個執行緒可能同時操作一個類,應該使用同步的類。
要特別注意對雜湊表的操作,作為key的物件要正確複寫equals和hashCode方法。
儘量返回介面而非實際的型別,如返回List而非 ArrayList,這樣如果以後需要將ArrayList換成LinkedList時,客戶端程式碼不用改變。這就是針對抽象程式設計。