HashMap,Hashset,ArrayList以及LinkedList集合的區別和用法

Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 

└WeakHashMap

一、基礎內容

容器就是一種裝其他各種對象的器皿。java.util包 
容器:Set, List, Map ,數組。只有這四種容器。 
Collection(集合) 一個一個往裏裝,Map 一對一對往裏裝。 
Set:沒有順序,不可以重複。 List:有順序,可以重複。 互相的equals就算重複。 
Map定義了存儲Key-Value的方法。 
Collection裏裝的必須都是Object,不能是基礎類型。比如Int類型的值分配在棧上,而棧上的內容都是動態的。 
容器類對象在調用remove,cotains等方法時,需要比較對象是否相等,這會涉及到對象類型的equals方法和hashCode方法,對於自定義的類型,需要重寫equals方法和hashCode方法以實現自定義對象相等。 
原則: 如果要重寫equals方法,那必須重寫hashCode方法。兩個對象互相equals,那這兩個對象必須具有相同的hashCode。 
比較兩個對象是不是相等的時候,主要用的是equals方法,當對象用在Map裏面作爲鍵時用hashCode方法,這樣效率比較高。當對象當做鍵的時候,hashCode會有用。 
兩個對象如果互相equals,那麼他們的hashCode一定相等。

二、HashMap,Hashset,ArrayList以及LinkedList集合的區別,以及各自的用法:

HashMap:HashMap實現了Map接口,底層使用的是Hash算法存儲數據。HashMap將數據以鍵值對的方式存儲。

HashSet:HashSet實現了Set接口,底層也是用的是Hash算法存儲數據。而且HashSet內部有HashMap類型的成員變量,方法也調用了HashMap的方法,存儲的時候只不過值爲null.

ArrayList:ArrayList實現了List接口,底層使用的是數組,存儲空間上是相鄰的,所以查詢起來會很方便,效率也會比LinkedList要高

LinkedList:實現了List接口,底層使用的是使用雙向鏈表的形式,存儲的數據在空間上很可能不相鄰,但是他們都有一個引用連在一起,所以增刪起來會很方便

Vector與ArrayList十分相似,區別就是就是vector是一種線程安全類,它的方法都帶有Synchronized關鍵字,實際中很少用到。如果遇到多線程的問題,JAVA提供了一個Collections工具類,可以把ArrayList轉換成線程安全的類。

三、

LinkedList類 
  LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。 
  注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List: 
    List list = Collections.synchronizedList(new LinkedList(...)); 

ArrayList類 
  ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。 
size,isEmpty,get,set方法運行時間爲常數。但是add方法開銷爲分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間爲線性。 
  每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。 
  和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。 
HashMap類 
  HashMap繼承Map接口,實現一個key-value映射的哈希表。任何非空(non-null)的對象都可作爲key或者value。 
總結 
  如果涉及到堆棧,隊列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。

發佈了25 篇原創文章 · 獲贊 15 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章