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;
}
分享到:
相关推荐
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。 简单的说,“相等的对象必须具有相等的散列码”。 3...
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
解析Java对象的equals()和hashCode()的使用
重写equals和hashcode方法,学习和进步
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
主要给大家介绍了关于java中为什么重写equals时必须重写hashCode方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Object类是所有Java类的根类,它定义了一些常用的方法,例如equals()、hashCode()、toString()等。本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 ...
Java中的equals()和hashCode()契约Java开发Java经验技巧共3页.pdf.zip
equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值。 hashCode():计算出对象实例的...当然,当对象所对应的类重写了hashCode()方法时,结果就截然不同了。
超详细_解释java_equals()与hashCode().pdf
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
HashCode相同equals不同的2位字符集合算法 另附ASCII码表
主要介绍了重写hashCode()和equals()方法详细介绍,涉及重写equals()方法,重写hashCode()方法,重写equals()而不重写hashCode()的风险等相关内容的介绍,具有一定借鉴价值,需要的朋友可以参考下
为什么重写equals方法,还必须要重写hashcode方法
主要介绍了探索Java中的equals()和hashCode()方法的相关资料,需要的朋友可以参考下
文章目录1、hashCode与equals两者之间的关系2、== 和equals的区别`3、为什么要重写equals()方法?4、重写equals()方法5、为什么要重写hashCode()方法?6、什么时候需要重写hashCode()方法?7、重写hashCode()方法: ...
NULL 博文链接:https://jackosn-liao.iteye.com/blog/528757