JAVA集合類圖:
1. hashmap原理,與hashtable區別 Java中的HashMap是以索引值對(key-value)的形式儲存元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把索引值對儲存在集合中合適的索引上。如果key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。
附上put的源碼:
[java] view plain copy public V put(K key, V value) { // HashMap允許存放null鍵和null值。 // 當key為null時,調用putForNullKey方法,將value放置在數組第一個位置。 if (key == null) return putForNullKey(value); // 根據key的keyCode重新計算hash值。 int hash = hash(key.hashCode()); // 搜尋指定hash值在對應table中的索引。 int i = indexFor(hash, table.length); // 如果 i 索引處的 Entry 不為 null,通過迴圈不斷遍曆 e 元素的下一個元素。 for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } // 如果i索引處的Entry為null,表明此處還沒有Entry。 modCount++; //這個mod是用於安全執行緒的,下文有講述 // 將key、value添加到i索引處。 addEntry(hash, key, value, i); return null; }
addEntry:
[java] view plain copy void addEntry(int hash, K key, V value, int bucketIndex) { // 擷取指定 bucketIndex 索引處的 Entry Entry<K,V> e = table[bucketIndex]; // <strong><span style="color:#ff0000;">將新建立的 Entry 放入 bucketIndex 索引處,並讓新的 Entry 指向原來的 Entry </span></strong> table[bucketIndex] = new Entry<K,V>(hash, key, value, e); // 如果 Map 中的 key-value 對的數量超過了極限 if (size++ >= threshold) // 把 table 對象的長度擴充到原來的2倍。 resize(2 * table.length); }
更詳細的原理請看: http://zhangshixi.iteye.com/blog/672697
區別:
http://blog.csdn.net/shohokuf/article/details/3932967
HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。 Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單線程環境,而Hashtable適合於多線程環境。 HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗(具體看下文)的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。 一般認為Hashtable是一個遺留的類。
2.讓hashmap變成安全執行緒的兩種方法
方法一:通過Collections.synchronizedMap()返回一個新的Map,這個新的map就是安全執行緒的. 這個要求大家習慣基於介面編程,因為返回的並不是HashMap,而是一個Map的實現.
[java] view plain copy