HashMap简单总结

一、 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

你可能感兴趣的:(HashMap)