面试的时候问到过这个问题,之前看书的时候也看到过,记得不算很牢固。
只隐约记得推荐使用不变类如 String,Integer 。
使用可变类作为HashMap键会带来什么问题?
如果使用可变类作为HashMap的键值,而不重写HashCode 和equals 方法,使用会产生同一键(对等的两个对象)存在两个地方的问题,产生可以存在重复键值 的假象。
为什么会产生这种现象,这就得看HashMap 怎么进行的put操作
HashMap 进行put操作 先拿到 key 的HashCode ,再对这个值执行hash函数拿到hash值,然后调用indexFor(hash, table.length); 方法找到hash 数组的槽位,如果key值为空,则赋值在0号槽位,然后遍历该槽位所在的链表,用key.equals判断如果存在相同的key就替换,否则用头插法加到槽位所在链表处。
具体过程各位看官请阅读HashMap源码,我这里看的是1.7 的版本。
通过分析HashMap put的过程我们知道,HashCode 主要用来定位 到哈希表的数组槽位,equals方法用来判断链表中是否有相同的key。如果没有重写HashCode方法,则调用的是Object的HashCode(返回对象的内部地址转换的一个整数值),两个理应对等的对象存在了不同的槽位所在链表,如果没有重写equals方法(Object的equals方法判断的是引用地址),两个理应对等的对象存在了同一个槽位所在链表的不同节点,而不是覆盖。
网友评论