`
ganlv
  • 浏览: 34931 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

equals为true时,hashcode必须相等

 
阅读更多
    equals为true时,hashcode必须相等,这个规则以前没有注意到,每次重写equals方法都没有思考hahsCode,写在这里做一个标记。

    如果重载了equals,而没有修改hashCode,在HashMap等类的使用上会出问题:
如:

public final class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
public PhoneNumber(int areaCode, int prefix,
int lineNumber) {
rangeCheck(areaCode, 999, "area code");
rangeCheck(prefix, 999, "prefix");
rangeCheck(lineNumber, 9999, "line number");
this.areaCode = (short) areaCode;
this.prefix = (short) prefix;
this.lineNumber = (short) lineNumber;
}
private static void rangeCheck(int arg, int max,
String name) {
if (arg < 0 || arg > max)
throw new IllegalArgumentException(name +": " + arg);
}
@Override public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof PhoneNumber))
return false;
PhoneNumber pn = (PhoneNumber)o;
return pn.lineNumber == lineNumber
&& pn.prefix == prefix
&& pn.areaCode == areaCode;
}
// Broken - no hashCode method!
... // Remainder omitted
}

然后把phoneNumber添加到map中:
Map<PhoneNumber, String> m
= new HashMap<PhoneNumber, String>();
m.put(new PhoneNumber(707, 867, 5309), "Jenny");

如果你想取出这个phoneNumber对应的人名:
m.get(new PhoneNumber(707, 867, 5309))

这个map返回的不是jenny而是null,是两个phoneNumber的HashCode不相同,尽管他们的是equals的。所以以后一定要注意,从写了equals方法要保证equals为true的时候,hashCode是相等的。

解决办法从写hashCode方法,让所以在equals参与运算的field都参与hashCode运算。
@Override public int hashCode() {
int result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
return result;
}

分享到:
评论

相关推荐

    Java_重写equals()和hashCode()

    当同时重写 `equals()` 和 `hashCode()` 时,需要注意的一点是,如果 `equals()` 返回true,那么两个对象的 `hashCode()` 必须相等。反之则不一定,因为不同的对象可能会产生相同的哈希码。这就是为什么在设计类时,...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    例如,在HashMap中,如果两个键通过 `equals()` 方法判断为相等,但它们的哈希码不同,那么HashMap会将它们视为不同的键,从而可能导致错误的结果。 **4. 注意事项** - 当重写 `equals()` 时,总是应该同时重写 `...

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

    * 如果x.equals(y)“返回true”,那么x和y的hashCode()必须相等。 * 如果x.equals(y)“返回false”,那么x和y的hashCode()可能相等,也可能不等。 在设计这两个函数时,需要注意以下几点: * 如果你设计的对象类型...

    Java中equals()与hashCode()的原理与设计

     如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。  如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。  简单的说,“相等的对象必须具有相等的散列码”。  3...

    Java中的equals()和hashCode()契约Ja

    在实现`equals()`和`hashCode()`时,应遵循以下最佳实践: - 如果重写了`equals()`,务必同时重写`hashCode()`。 - 使用对象的属性来计算哈希码,而不是对象的引用。 - 在`equals()`方法中,使用`==`来比较基本类型...

    equals与hashCode在实际开发中的重写写法

    1. 相等的对象必须具有相同的哈希码:如果 x.equals(y) 返回 `true`,那么 x.hashCode() 应该等于 y.hashCode()。 2. 不相等的对象可能具有不同的哈希码:如果 x.equals(y) 返回 `false`,则 x.hashCode() 和 y....

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

    x.equals(y)返回true,y.equals(z)返回true时,z.equals(x)也必须返回true;x.equals(y)返回true时,如果x和y内容一直不变,不管重复调用x.equals(y)多少次,返回都是true;x.equals(null)永远返回false;x.equals(和x...

    equals与hashCode方法讲解

    equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法的实现是比较两个对象的内存地址是否相等。如果两个对象的内存地址相同,那么它们就是相等的。...

    HashCode相同equals不同的2位字符集合算法

    标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个对象可能具有相同的哈希码(hashCode),但并不意味着它们相等(equals返回true)。这个问题在处理自定义类对象时尤为关键,特别...

    hashcode()和equals()

    如果两个对象的 `equals()` 返回 `true`,那么它们调用 `hashCode()` 必须返回相同的值,否则可能会导致哈希表冲突,影响效率。 `equals()` 方法用于比较两个对象是否相等。在 `Object` 类中,它的默认实现是基于...

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

    根据`hashCode()`的约定,如果两个对象通过`equals()`方法判断相等,那么它们的哈希码必须相同。反之,如果两个对象的哈希码不同,它们在哈希表中通常被视为不相等,但哈希码相同并不意味着对象一定相等,因为不同的...

    java中hashcode()和equals()方法详解

    - 如果两个对象相等(即`equals()`返回`true`),则它们的`hashCode()`值必须相同。 - 如果两个对象不相等(即`equals()`返回`false`),它们的`hashCode()`值不一定不同,但最好尽量让它们不同,以减少哈希冲突。 ...

    hashcode和equals的分析

    1. **一致性**:如果两个对象相等(通过`equals`方法判断),则它们的`hashCode`值必须相同。 2. **可变性**:如果两个对象的`hashCode`值相同,并不一定意味着这两个对象相等。 ### 3. 实例分析 假设我们有一个名...

    重写hashCode()和equals()方法详细介绍

    默认的`equals()`行为是基于引用的相等性,即只有当两个引用指向内存中的同一个对象时,`equals()`才返回`true`。如果需要基于对象的内容或属性进行比较,就需要重写`equals()`。重写`equals()`时,应遵循以下原则:...

    java 基础之(equals hashcode)

    如果 `equals()` 认为两个对象相等,那么它们的 `hashCode()` 必须相同。如果 `equals()` 认为它们不等,则 `hashCode()` 可以不同,但不应相同,以避免哈希冲突。 在 `EqualsTest.java` 文件中,我们可以预期会...

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

    如果两个对象根据`equals()`方法判断相等,那么它们的`hashCode()`方法必须返回相同的值。但是,两个不相等的对象可能会有相同的哈希码,这是一种允许的冲突情况,但应尽可能减少冲突以优化哈希表的性能。 Java的`...

    为什么在重写 equals方法的同时必须重写 hashcode方法

    因此,为了保证对象在集合中的正确行为,当重写 `equals` 方法时,必须同时重写 `hashCode` 方法,确保相等的对象具有相同的哈希值。这样,集合可以正确地识别和处理相等的对象,避免数据一致性问题。同时,遵循这个...

    Java中的equals和hashCode方法详解1

    如果两个对象通过`equals()`方法比较后相等,那么它们的`hashCode()`方法必须返回相同的值。这是因为哈希表(如`HashSet`)依赖于`equals()`和`hashCode()`的一致性来正确地存储和查找对象。如果两个对象相等但它们...

    关于Object中equals方法和hashCode方法判断的分析

    Java 在判断两个对象是否相同时,首先会比较它们的 hashCode 值,如果相同,那么就会比较它们的 equals 方法,如果 equals 方法也返回 true,那么这两个对象就被认为是相同的。 下面是一个简单的示例代码,演示了...

    equals 和 hashCode两者效果分析详解.docx

    这意味着,如果两个对象`equals()`返回`true`,那么它们的`hashCode()`也必须相同。反之,如果`equals()`返回`false`,`hashCode()`可以相同也可以不同。违反这一约定可能导致容器(如HashMap和HashSet)的行为不可...

Global site tag (gtag.js) - Google Analytics