標籤:儲存 next 類型 曆史 array table abs pre tom
List:(有序,能夠反覆)通過下標索引 ----ArrayList 可變數組,隨機尋找 ----LinkedList 鏈表,不論什麼位置插入刪除快 ----Vector 效率比arraylist低。可是能夠用於多線程同步
Set:(無序,不能夠反覆)set最多有一個null元素。由於不能夠反覆 ----HashSet 沒有排序,不反覆(順序隨機) ----LinkedHashSet 按插入排序。不反覆(按插入順序) ----TreeSet 實現Comparable介面,對象能夠比較(依照插入值大小升序)(依照二叉樹排序)
Map:(鍵值類似list中的下標。可是map下標是隨意類型,list下標僅僅是int類型) ----HashMap 定位、插入刪除一個映射搞笑 (順序隨機) 不同步,同意null value -- null key ----Hashtable 同步。不同意null鍵值 ----LinkedHashMap 依照插入順序排序 (按插入順序) ----TreeMap 在遍曆排好序的鍵值是高效的,實現Comparable介面 (依照鍵值升序)(依照二叉樹排序)
Hashmap、Hashtable都是一個數組和鏈表的結合體(在資料結構稱“鏈表散列“)hashTable和hashMap的差別: ----Hashtable 中的方法是同步的。而HashMap中的方法在預設情況下是非同步的。 ----Hashtable中key和value都不同意null值,而HashMap中僅僅同意一個null鍵。值能夠為null。 ----HashMap效率比Hashtable高 ----繼承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
----雜湊值的使用不同,Hashtable直接使用對象的hashCode。而HashMap又一次計算hash值,並且用與取代求模 ----Hashtable中hash數組預設大小是11。添加的方式是 old*2+1。
HashMap中hash數組的預設大小是16,並且一定是2的指數。 ----Hashtable、HashMap都使用了 Iterator。而因為曆史原因,Hashtable還使用了Enumeration的方式 詳細使用:
Map map = new HashMap();map.put("a","100");map.put("b","200");map.put("c","200");Iterator iter = map.entrySet().iterator();while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = entry.getValue();}//或者for(Map.Entry entry : map.entrySet()){ Object key = entry.getKey(); Object value = entry.getValue();}
Java的類為什麼須要hashCode?(hashCode的作用)
總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。你知道它們的差別嗎?前者集合內的元素是有序的。元素能夠反覆;後者元素無序,但元素不可反覆。那麼這裡就有一個比較嚴重的問題了:要想保證元素不反覆,可兩個元素是否反覆應該根據什麼來推斷呢?這就是 Object.equals方法了。
可是,假設每添加一個元素就檢查一次,那麼當元素非常多時,後加入到集合中的元素比較的次數就非常多了。
也就是說,假設集合中如今已經有1000個元素。那麼第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大減少效率。
於是。Java採用了雜湊表的原理。雜湊演算法也稱為散列演算法,是將資料依特定演算法直接指定到一個地址上。關於雜湊演算法。這裡就不具體介紹。能夠這樣簡單理解,hashCode方法實際上返回的就是Object Storage Service位置的映像。
這樣一來。當集合要加入新的元素時,先調用這個元素的hashCode方法,就能定位到它應該放置的儲存位置。
假設這個位置上沒有元素,它就能夠直接儲存在這個位置上,不用再進行不論什麼比較了。假設這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,同樣的話就不存了,不同樣就表示發生衝突了。散列表對於衝突有詳細的解決的方法,但終於還會將新元素儲存在適當的位置。這樣一來,實際調用equals方法的次數就大大減少了,差點兒僅僅須要一兩次。
1、相等的對象必須具有相等的雜湊碼(或者散列碼)。
2、假設兩個對象的hashCode同樣,它們並不一定同樣。(hashCode()相等的equals()不一定相等;equals()相等的hashCode()肯定相等)
請註明出處:http://blog.csdn.net/df1012890048/article/details/38672155
java集合: List、Set、Map總結 + HashMap/Hashtable 差別