重写hasHashCode时如何计算对象的HashCode

[color=blue]From Effective Java Sencond Edition Item9[/color]

[size=medium]1. Store some constant nonzero value, say, 17, in an int variable called result.

2. For each significant field f in your object (each field taken into account by the equals method, that is), do the following:
a. Compute an int hash code c for the field:
i. If the field is a boolean, compute [color=green](f ? 1 : 0).[/color]
ii. If the field is a byte, char, short, or int, compute [color=green](int) f[/color].
iii. If the field is a long, compute [color=green](int) (f ^ (f >>> 32))[/color].
iv. If the field is a float, compute[color=green] Float.floatToIntBits(f)[/color].
v. If the field is a double, compute [color=green]Double.doubleToLongBits(f)[/color], and then hash
the resulting long as in step 2.a.iii.
vi. If the field is an object reference and this class’s equals method com-
pares the field by recursively invoking equals, recursively invoke hashCode
on the field. If a more complex comparison is required, compute a
[color=red]“canonical representation”[/color] for this field and invoke hashCode on the
canonical representation. If the value of the field is null, return 0
(or some other constant, but 0 is traditional).
vii. If the field is an array, treat it as if each element were a separate
field.That is, compute a hash code for each significant element by applying
these rules recursively, and combine these values per step 2.b. If every
element in an array field is significant, you can use one of the
[color=green] Arrays.hashCode[/color] methods added in release 1.5.
b. Combine the hash code c computed in step 2.a into result as follows:
[color=green] result = 31 * result + c;[/color]

3. Return result.

4. When you are finished writing the hashCode method, ask yourself whether equal instances have equal hash codes. Write unit tests to verify your intuition! If equal instances have unequal hash codes, figure out why and fix the problem.
[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 重写equals方法必须重写hashcode方法,是因为在Java中,如果两个对象的equals方法返回true,则它们的hashcode方法必须返回相同的值。如果不重写hashcode方法,那么两个相等的对象可能会有不同的hashcode值,这会导致它们无法正确地被放入基于哈希表的集合中,例如HashSet、HashMap等。因此,为了保证对象在哈希表中的正确性,必须同重写equals和hashcode方法。 ### 回答2: 在 Java 语言中,equals 和 hashCode 是 Object 类的两个方法,它们都用来比较对象的相等性。equals 实际上是比较两个对象是否相等,而 hashCode 方法返回的是一个散列码(即哈希码),它是用来确定对象在哈希表中的位置的。 哈希表是一种数据结构,它可以用来实现集合、映射等数据结构。在 Java 中,哈希表被广泛应用于各种数据结构中,如 HashMap、HashSet 等。当对象被添加到哈希表中,哈希表会根据对象的哈希码确定对象在哈希表中的位置,从而实现高效的访问。因此,如果重写了 equals 方法,但没有重写 hashCode 方法,则会导致对象无法正确地插入到哈希表中,从而影响哈希表的性能和正确性。 为了避免这种问题,我们需要确保重写了 equals 方法的同重写hashCode 方法。当两个对象相等,它们的 hashCode 值也必须相等;反之,当两个对象hashCode 值相等,并不能说明它们相等,因为存在哈希冲突的可能。因此,在重写 hashCode 方法,通常需要考虑对象的所有用于比较相等性的字段,以保证哈希码的唯一性和一致性。 在实际编程中,我们经常会使用 IDE 自动生成 equals 和 hashCode 方法。然而,如果对象的字段发生变化,我们必须重新生成 hashCode 方法,否则仍会出现哈希冲突和性能问题。因此,我们建议及重写 hashCode 方法,以保证代码的正确性和可维护性。 ### 回答3: 在Java中,equals方法用于比较两个对象是否相等。但是,equals方法并不能直接判断两个对象是否相等,它需要使用hashcode方法进行辅助判断。如果两个对象hashcode相同,那么它们并不一定相等,需要使用equals方法再次判断。 因此,当我们重写equals方法,需要同重写hashcode方法。如果我们只重写equals方法而不重写hashcode方法,那么可能会导致出现以下两个问题。 第一个问题是不符合规范。在Java中,如果两个对象的equals方法返回值相等,那么它们的hashcode方法的返回值也必须相等。如果我们只重写了equals方法而不重写hashcode方法,就可能会导致这种情况的出现,违反了Java规范。 第二个问题是影响性能。在Java中,如果两个对象hashcode方法的返回值不相等,那么它们一定不相等。如果我们只重写了equals方法而不重写hashcode方法,那么每次调用equals方法都会进行完整的比较,这会对性能产生很大的影响。而如果我们同重写hashcode方法,那么可以将对象按照hashcode的返回值进行分类,然后只需要比较同一个hashcode分类中的对象是否相等,这样可以大大提高比较的效率。 因此,为了保证代码的规范和性能,我们在重写equals方法也必须同重写hashcode方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值