Hashtable 處理 Hash衝突 時經過單鏈表。。java
Hashtable的count字段是何時初始化的?從賦值來看是經過readObject()方法來實現的。可是具體實現須要回去取研讀下《Java編程思想》序列化章節內容。編程
private transient int count;
能夠根據hash函數(key.hashCode() & 0x7FFFFFFF) % key數組如今的長度
來模擬hash衝突,只要key的hashCode是相同可是又不equals()的就是Hash衝突。以下實例:數組
public class MyKey implements Serializable { private int i; public MyKey(int i) { this.i = i; } [@Override](https://my.oschina.net/u/1162528) public int hashCode() { if (i % 2 == 0) { return 1; } else { return 2; } } }
以下實例:安全
public static void main(String[] args) { Hashtable<MyKey, Integer> map = new Hashtable<>(); for (int i = 0; i < 11; i++) { map.put(new MyKey(i), i); } map.get(new MyKey(1)); }
Hashtable在IDEA下的默認視圖:ide
如何查看對象視圖?以下圖操做:函數
對象視圖以下this
從如上對象視圖能夠看出Hashtable的table字段的具體存儲方式: table數組中有兩個元素,一個是MyKey.i=10
,一個是Mykey.i=9
,按如上查看對象視圖的方法查看這兩個元素的對象視圖查看java.util.Hashtable.Entry#next
屬性,能夠看到MyKey.i=10
的next屬性值是MyKey.i=8
... 各元素的具體結構以下:.net
MyKey.i=10.next -> MyKey.i=8 MyKey.i=8.next -> MyKey.i=0 MyKey.i=0.next -> MyKey.i=2 MyKey.i=2.next -> MyKey.i=4 MyKey.i=4.next -> MyKey.i=6 MyKey.i=6.next -> null MyKey.i=9.next -> MyKey.i=1 MyKey.i=1.next -> MyKey.i=3 MyKey.i=3.next -> MyKey.i=5 MyKey.i=5.next -> MyKey.i=7 MyKey.i=7.next -> null
爲何順序不是按加入的順序的呢,而是一部分到過來的?
由於Hashtable的key數組默認大小是11,當加入11個元素時,會自動擴容,在加入第8個元素時會rehash一次,rehash時是將新哈希表中的元素做爲後面加入元素的next的,全部就會出現部分元素順序相反。線程