`
sunting_bcwl
  • 浏览: 95898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hashCode规则

    博客分类:
  • Java
阅读更多
摘自Effective Java
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
compares 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).
47
48
CHAPTER 3
METHODS COMMON TO ALL OBJECTS
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.

例:
@Override public int hashCode() {
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}

分享到:
评论

相关推荐

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    深入HashCode

    这是Java Object类中的约定,也是所有自定义类应该遵循的规则。违反这个约定可能会导致哈希表的行为异常,例如,预期的查找失败或者删除困难。 三、`hashCode()`的实现策略 实现`hashCode()`时,需要考虑以下几点...

    Java_重写equals()和hashCode()

    这篇博客将深入探讨这两个方法的重写规则和应用场景。 首先,`equals()` 方法是Object类中的一个基础方法,用于比较两个对象是否相等。默认情况下,它比较的是对象的内存地址,也就是引用是否相同。但在实际开发中...

    hashcode()和equals()

    在开发中,遵循以下规则是非常重要的: 1. 如果 `equals()` 方法被重写,那么 `hashCode()` 也应该被重写。否则,当对象作为哈希表的键时,可能导致不一致的结果。 2. `equals()` 方法应该满足自反性、对称性、传递...

    解析Java对象的equals()和hashCode()的使用

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密...equals()和hashCode()函数的使用是紧密配合的,需要遵循一定的规则和要求,才能确保整个程序的正常运行。

    JAVA_高级特性(hashCode,clone,比较器,Class反射,序列化)

    在 Java 中,可以使用 `Comparator` 接口来定义对象的排序规则。`Comparator` 是一个函数式接口,可以通过实现它的 `compare` 方法来自定义比较逻辑。例如,如果我们想按照年龄升序排序 `Person02` 对象,可以定义一...

    关于重写equals,hashcode以及compareTo方法!

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

    如何生成一个合适的hashcode方法Java开发Java

    违反这一规则可能会导致哈希表的行为不一致,从而引发难以调试的问题。 总结起来,生成一个合适的`hashCode()`方法是Java开发中的重要技能,需要考虑对象的特性、哈希码的分布性和效率。通过合理地组合对象字段的...

    comparing java objects_hashcode_Comparing_

    - `Comparator`可以用来创建自定义排序规则,例如按年龄、姓名或其他属性排序。 总之,理解和正确使用哈希码和比较机制对于优化Java程序性能和避免逻辑错误至关重要。在处理集合和映射时,确保`equals()`和`...

    Java hashCode() 方法详细解读

    在编写自定义类时,通常需要重写`equals()`和`hashCode()`方法,确保它们遵循上述规则。例如,下面是一个简单的`Employee`类的实现: ```java public class Employee { private int employeeId; private String ...

    JAVA hashCode使用方法详解

    3. **重写规则**: - 当我们重写 `equals()` 方法时,通常也应当重写 `hashCode()`。这是因为如果两个对象通过 `equals()` 认为是相等的,那么它们的 `hashCode()` 应该也相等。反之,如果 `equals()` 返回 `false`...

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    4、**重写equals()方法的规则**: 重写`equals()`方法时,应遵循四个规范: - **自反性**:一个对象总是与自身相等。 - **对称性**:如果A等于B,那么B也应该等于A。 - **传递性**:如果A等于B,B等于C,那么A也...

    JAVA PMD规则 详解

    - **规则描述**:此规则建议要么同时覆盖`public boolean Object.equals(Object other)`和`public int Object.hashCode()`方法,要么都不覆盖。即使从父类继承了`hashCode()`方法,也建议显式实现`hashCode()`并...

    学习Object类——为什么要重写equeals和hashcode方法

    Object 类的 equals 和 hashCode 方法的重要性与实现 在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...

    探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    所以,可以考虑在集合中,判断两个对象是否相等的规则是:第一步,如果hashCode()相等,则查看第二步,否则不相等;第二步,查看equals()是否相等,如果相等,则两obj相等,否则还是不相等。 为什么选择hashCode方法...

    Java equals 方法与hashcode 方法的深入解析.rar

    违反这一规则可能导致哈希表的行为不正确,例如,当两个相等的对象被添加到`HashSet`时,可能会只存储一个,因为哈希码相同但`equals()`未被正确重写,导致误认为是重复项。 以下是一个简单的`equals()`和`hashCode...

    TEH:Java Tostring Equals Hashcode with annotations

    TEH 使用注解来实现 toString、equals 和 hashCode,并强制执行这 2 条规则 任何用于 hashCode 的属性都将用于 equals 和 toString 用于 equals 的任何属性都将用于 toString 注释是 @ToString @ToStringEquals ...

    java中hashcode()和equals()的详解.docx

    - **遵循基本规则**: - **自反性**:对于任何非空引用值`x`,`x.equals(x)`应该返回`true`。 - **对称性**:对于任何非空引用值`x`和`y`,当且仅当`y.equals(x)`返回`true`时,`x.equals(y)`才返回`true`。 - **...

    javahashcode()和equals()和==的介绍和区别.pdf

    当我们比较两个对象时,通常遵循以下规则: 1. 如果`hashCode()`返回的值不同,那么两个对象被认为是不相等的,因为它们不会映射到同一个哈希桶,从而减少了比较`equals()`的需要。 2. 如果`hashCode()`返回的值相同...

Global site tag (gtag.js) - Google Analytics