首先链接下 HashMap的数据结构
转一遍:http://www.iteye.com/topic/539465/ 这个解析的挺精辟的。
1.hashmap中并非顺序的排序,根据计算出来的 hashcode计算 i = h&(tabel.length-1),
根据hashcode的计算规则
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
由此可见,put进入hashmap数组的对象是非顺序的。
2.通过上面的规则,可以发现1,10,127,在默认的长度为16的数组中,都是在 i=2
那么数据结构为这样的格式。
3.hashmap动态添加数组当
if (size++ >= threshold)
threshold = table.length * 0.75
当达到这个容量的时候,就需要动态添加数组数组的容量为 table.length*2
4.需要将原来数组中的数据,赋值给新的数据
void transfer(Entry[] newTable) {
Entry[] src = table;
int newCapacity = newTable.length;
for (int j = 0; j < src.length; j++) {
Entry<K,V> e = src[j];
if (e != null) {
src[j] = null;
do {
Entry<K,V> next = e.next;
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
} while (e != null);
}
}
}