基础的东西永远是最重要的,值得反复学习,面试时,这点也能看出一个人的基本功力。
1、关于HashCode和HashMap以及equals()方法的理解
1. hashcode的默认实现是地址的hash散列,既然是hash散列,
从大范围映射至小范围,就可能出现hash碰撞
2. 部分对象对hashcode进行了重写,比如String,字符串的hash散列,
要获取对象的堆地址,并不像c,c++那么容易,需要sun.misc.Unsafe类,jvm再表。
3. 确定对象是否相同时,还得使用equals方法。根据equals()和hashcode()的规范,
就是类似原值和散列值的关系。
4. hashcode()方法重写应该遵循不变性,如果变化了,在HashXxx中,会有bug
2、HashMap理解和源码解读,HashMap有很多细节,尤其是1.7和1.8有着很大差别
- hashmap的结构是hash表,采用了链地址法,就是数组(table)+ 加链表的方式,
数据既可以放在数组中,也可以放在链表中 - 在扩容时,条件size > length * 0.75,所以说数组不会满,相反很可能超过一半为空,
这是由于减少hash碰撞。 - 1.7时key不能为null,直接丢弃,1.8时可以,放在数组的0位置上。
- 1.7在扩容时会重新计算hash值,也就是rehash过程,而1.8没有,添加了一位(自身相关参数计算)
- 1.7有rehash过程,多线程情况下可能出现死循环,1.8则不会,但是会出现数据丢失(返回null)
等问题,多线程安全可以专门分析一下
hashmap的容量是链表加数组吗_看完这篇,终于搞懂HashMap的源码了