`
- 浏览:
34157 次
- 性别:
- 来自:
西安
-
重写hasHashCode时如何计算对象的HashCode
From Effective Java Sencond Edition Item9
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 (f ? 1 : 0).
ii. If the field is a byte, char, short, or int, compute (int) f.
iii. If the field is a long, compute (int) (f ^ (f >>> 32)).
iv. If the field is a float, compute Float.floatToIntBits(f).
v. If the field is a double, compute Double.doubleToLongBits(f), 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
“canonical representation” 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
Arrays.hashCode methods added in release 1.5.
b. Combine the hash code c computed in step 2.a into result as follows:
result = 31 * result + c;
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.
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
在重写 `hashCode()` 时,通常会基于 `equals()` 方法中用于比较对象相等性的属性来计算哈希码。例如,如果一个类有三个属性(a, b, c),则可以这样重写: ```java @Override public int hashCode() { int result...
重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...
当我们在自定义类中重写 `equals()` 方法时,通常也需要重写 `hashCode()` 方法,这是为了遵循一些重要的原则和保证数据结构如 `HashMap`、`HashSet` 的正确行为。 首先,`equals()` 方法用于比较两个对象是否相等...
例如,在Hashtable、HashMap、HashSet、LinkedHashMap等容器中,我们需要重写hashcode()方法,使其生成对象的哈希码,以便于快速地查找和比较对象。 compareTo()方法是Comparable接口中的一个方法,它用于比较两个...
这两个方法有着紧密的联系,因为它们在决定对象是否相等以及如何存储和检索对象时起到关键作用。 首先,让我们了解 `equals()` 方法。`equals()` 是从 `Object` 类继承的方法,用于比较两个对象是否相等。默认情况...
总结来说,Java序列化用于保存和传输对象,而重写`equals`和`hashCode`方法则是为了确保对象比较和在哈希表中的操作符合预期。在实际开发中,理解并恰当地应用这些概念对于构建高效、健壮的Java应用程序至关重要。
默认的`equals()`行为是基于引用的相等性,即只有当两个引用指向内存中的同一个对象时,`equals()`才返回`true`。如果需要基于对象的内容或属性进行比较,就需要重写`equals()`。重写`equals()`时,应遵循以下原则:...
默认的 `Object` 类实现是比较两个对象的内存地址,这意味着只有当两个引用指向同一个对象时,`equals()` 才会返回 `true`。在大多数情况下,我们需要根据对象的属性来判断两个对象是否相等。例如,如果有一个 `...
如果我们不重写 hashCode(),那么对象的 hashCode 将会默认使用 Object 类中的 hashCode 方法,这样将会导致对象的存储位置不确定。 例如,如果我们有两个对象,它们的 hashCode 都是 1,那么它们将会被存放在同一...
- `Hashtable` 在计算 `HashCode` 时,会将 `HashCode` 的值与 `0x7FFFFFFF` 进行按位与操作,以确保结果为正整数。 - 进一步地,计算出的 `HashCode` 会通过模运算 `% hs.length` 来确定实际的数组索引位置。 4....
不这样做可能会导致集合行为异常,特别是当尝试添加或查找对象时。在进行集合操作时,遵循`equals()`和`hashCode()`的约定是非常重要的,因为它直接影响到集合的性能和正确性。 总的来说,通过IDEA的快捷键功能,...
如果我们只重写了 `equals()`,但没重写 `hashCode()`,当将这些对象用作 `HashMap` 的键时,可能会遇到问题。例如,两个内容相同但 `hashCode()` 不同的 `String` 对象会被存储在哈希表的不同位置,导致预期的覆盖...
例如,在比较八大包装对象(如 int、float 等)和 String 类对象时,默认比较的是值,而不是比较对象的引用地址。重写 equals() 方法可以确保比较的是对象的值,而不是比较对象的引用地址。 重写 hashCode() 方法 ...
"Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object...同时,我们还需要注意到,重写equals方法时,必须重写hashCode方法,以便于确保对象的正确性和一致性。
在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而不是内存地址。下面我们将详细地解释为什么需要重写这...
总结来说,当重写 `equals()` 方法以比较对象内容时,也需要重写 `hashCode()` 方法以保持对象平等性和哈希码的一致性。这样可以确保散列数据结构能够正确处理相等的对象,防止出现不应有的重复元素。对于 Java ...
只有当两个对象的Hashcode相同,并且equals方法返回true时,这两个对象才能被认为是相等的。 Hashcode的作用 Hashcode的主要作用是用来标识对象的身份。在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演...
这些概念在Java编程中至关重要,特别是在处理集合类和比较对象时。 1、**hashCode与equals两者之间的关系**: 当我们说两个对象`equals()`返回`true`时,意味着它们在逻辑上是相等的。根据Java规范,如果两个对象...