一道面试题看 HashMap 的存储方式
2014-06-04 11:31
218 查看
一道面试题看 HashMap 的存储方式
我们公司招人喜欢问算法题和一些基础知识。今天我们一个面试官在面试候选人之前在办公室对我们说他准备问一个这样的问题:在HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型。放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key 从 HashMap 里取出元素,这时候 HashMap 会返回什么?
我们办公室几个人答案都不一致,有的说返回null,有的说能正常返回value。但不论答案是什么都没有确凿的理由。我觉得这个问题挺有意思的,就写了代码测试。结果是返回null。需要说明的是我们自定义的类重写了 hashCode 方法。我想这个结果还是有点意外的,因为我们知道 HashMap 存放的是引用类型,我们在外面把 key 更新了,那也就是说 HashMap 里面的 key 也更新了,也就是这个 key 的 hashCode 返回值也会发生变化。这个时候 key 的 hashCode 和 HashMap
对于元素的 hashCode 肯定一样,equals也肯定返回true,因为本来就是同一个对象,那为什么不能返回正确的值呢?
先来看看一段测试代码:
先解释一下测试代码做到事。定义了一个person类,就两个属性。重写了 hashCode 方法,还有一套geter和seter,没什么特别。测试类里面先创建了三个person对象作为 key 。打印各个 key 的 hashCode 值。然后三个元素放到 HashMap ,接着更新其中一个 key 的name属性,最后去取这个 key 的value。
我们来看一下 HashMap 的get方法源代码:
当我们再去取元素的时候,key.hashCode的值已经出现了变化,所以这里的hash函数结果也发生了变化,所以当它尝试去获得这个 key 的存储位置时就不能得到正确的值,导致最终找不到目标元素。要想能正确返回,很简单,把Person类的 hashCode 方法改一下,让它的 hashCode 不依赖我们要修改的属性,但实际开发中肯定不能这么干,我们总是希望当两个对象的属性不完全相同时能返回不同的 hashCode 值。所以结论就是当把对象放到 HashMap 后,不要去修改 key 的属性。
以上都是很基础的东西,但或许我们很多时候都没注意到,了解这些基础可以避免一些很诡异的bug。纯属抛砖引玉,如有谬误请海涵和指出。
本文作者: 伯乐在线 - 梧桐
相关文章推荐
- 一道面试题看 HashMap 的存储方式
- (转)一道面试题看 HashMap 的存储方式
- 一道面试题看 HashMap 的存储方式
- 一道面试题看 HashMap 的存储方式
- 一道面试题看 HashMap 的存储方式
- 一道面试题看 HashMap 的存储方式
- Python之美[从菜鸟到高手]--读"一道面试题看 HashMap 的存储方式"的联想
- 一道面试题看 HashMap 的存储方式
- 一道面试题引发的问题:浮点数和整数在计算机种的存储方式
- (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
- 一道面试题引发的问题:浮点数和整数在计算机种的存储方式
- c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
- (转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考
- 多个对象访问共享对象和数据的方式——一道JAVA就业面试题的不同解法
- HashMap存储自定义对象练习(两种取出方式)
- Map hashMap 两种存储方式
- HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。
- 一道面试题:举例说明[存储过程],[视图]和[自定义函数]的应用场合
- 【腾讯面试题】判断机器的大小端存储方式。
- 今天做到一道面试题:Android中进程的通信方式