java – 字符串作为hashmap的关键字

参见英文答案 > Mutable vs immutable objects                                    10个
过去一小时我读过很多帖子,但我仍然不清楚使用不可变对象作为Hashmap中的键的概念.我有一个hashmap有一个字符串的键. hashmap中的值是MyStore,其中MyStore表示有关我拥有的商店的信息.字符串表示地址.在我的代码中,我的逻辑是,我首先在地图上查找该键,如果存在 – >得到它的价值,如果它不存在放在hashmap.我的经理刚才告诉我,未来的关键将会改变,那就是我的商店的地址会在将来改变.他说在这种情况下,我的逻辑首先检查密钥是否存在将无法正常工作.我不明白他在这里的意思.我想很清楚地了解以下几点 –

> hashmap的可变和不可变键的区别.
>如果您使用可改变的不可变键,会发生什么? – 我知道这没有意义,但我想清楚地了解我的经理在这里谈论什么.
>有些帖子谈论字符串,如果用作哈希表缓存中的关键字哈希码 – 这是什么意思?
>如果让我说我使用可变对象作为我的hashmap中的key来实现hashcode和equals,那么它会工作吗?我假设它会因为键改变,如果键存在,则包含方法将会看.如果不存在,它将输入该项,以便将来可以得到它.

如果以前讨论过,我不是要创建一个重复的帖子.如果我错过阅读有关我所有问题的答案的帖子,请点击我.如果没有,请以外行人士的方式解释上述问题,以便其他读者在未来有用:)随时编辑我的帖子的主题,如果有任何人有类似的问题,他们将在这里直接:)

最佳答案
第一:HashMap如何工作?

基本上它有一个数组,当你把地图中的一个键值对,它被存储在数组中的一个位置.基于传递给哈希方法的键的hashCode()的结果,选择阵列中的位置.这是为什么?那么,如果你请求某个键的值,那么可以简单地重新计算数组中找到键及其关联值的索引,以再次找到数组中的索引. (需要更多的逻辑来处理映射到相同索引的密钥,但我只是想让你理解基本机制)然后equals()用于验证计算索引中的密钥是否确实是请求密钥

>从这一点,应该更清楚为什么不可变键比可变键更好.一个不可变的键将始终保持相同的hashCode()值,并且哈希函数将再次找到正确的bucket(= hashMap的数组中的索引).

这并不意味着可变键不能正常工作.如果密钥上的突变不影响散列码,或者只要使用hashMap,这些密钥就不会被突变,那么一个可变密钥将会起作用.
>如何改变不可变的钥匙?那么,密钥本身可能无法改变,但是键值映射可以改变业务逻辑.如果你创建一个地图,使用地址作为一个关键,你依靠的事实,一个商店的地址不会改变.如果商店的地址发生变化,您将无法使用其新地址作为关键字在地图中找到该地址.你的经理有一个有效的点.
>在Map中找到密钥的速度很大程度上取决于计算hashCode的速度.对于字符串,此计算循环了String中的所有字符.如果您使用长字符串作为键,并且有很多地图访问,这可能会导致性能瓶颈.因此,Java的String实现缓存哈希值,因此它将仅计算一次.但是,如果您再次使用相同的String实例,则只会避免计算哈希码(新实例不具有缓存值).你可以实习()你使用的钥匙,但只有当它可以显示真的是一个性能瓶颈时,才会考虑这一点,因为String的实习确实有自己的开销.
>如1中所述:可变键可以工作,如果他们的哈希码不受突变的影响.例如使用Customer作为关键字,其中hashCode()仅基于客户的名称,那么只有不允许名称更改但允许其他值更改的Customer实现才是可靠的密钥.

转载注明原文:java – 字符串作为hashmap的关键字 - 代码日志