为什么不在方法HashCode()中使用非最终字段来生成hashCode

Aja*_*jay 2 java hashcode

嗨我从封面(静态工具)得到建议,只在hashCode中使用非最终字段.为什么我们不能使用非final字段来生成hashCode.错误ID是:MUTABLE_HASH_CODE

Joh*_*n B 6

我们的想法是,如果两个对象相等,则它们必须具有相同的哈希码.所以进入下一步,你可以说一个对象应该总是具有相同的哈希码.显然,如果在哈希码计算中使用非最终字段,则哈希码将不会保持不变.

有关更具体的示例,如果您将一个对象放在一个hashmap中,然后更改该对象,以便hashcode现在在hashmap的错误存储桶中更改该对象.坏!


Pet*_*rey 6

hashCode通常用于Hash集合,例如HashSet或HashMap.如果任何字段更改会改变hashCode,则会使集合处于无效状态.

出于这个原因,hashCode和equals中使用的字段(如果有的话,还是compareTo)最好只使用final字段.另一种选择是仅使用不改变的字段,但这更难检查和执行.