一、 HashMap是数组链表(链式地址法)。他的容量是2的次幂,这是因为2的次幂可以在计算数组下标的运算中h & (length-1)可以得到比较均匀的下标,同时位运算&比直接%的效率要高。有的书中说用质数,这两个到底那个好呢,俺不知道。
二、 HashMap有个初始容量是默认是16,一般我们用就直接new HashMap();了,而如果你要里面装的东西的数量超过16*0.75=12了,那他会自动扩容原来的1倍,扩容是很消耗性能的。所以如果你能大体知道装入的数量的话,最好给赋一个初始容量
三、查找对象
1、根据key的hasocde()得到哈希值int hash = hash(k.hashCode());
2、根据哈希值确定元素在数组中的位置 int i = indexFor(hash, table.length);
3、找到指定位置 的链表,循环比较,先“==”比较,如果不等,再“equals”比较,如果有一个比较相等,就说明找到元素了。
所以说到这里,我想大家也明白了,为什么要把一个对象放进HashMap的时候,最好是重写hashcode()方法和equals 方法呢?根据前面的
分析,hashcode()可以确定元素在数组中的位置,而equals方法在链表的比较时要用到。
参考资料:http://www.iteye.com/topic/539465