很多人在重写equals时,都会看到网上一般推荐同时重写hashCode,为什么呢?一开始我以为equals中比较的是hashCode,查了下源码发现并不是这么回事,那么到底为什么会有这么一个推荐呢?
而String重写了equals同时重写了hashCode,重写hashCode代码如下:
通过源码可以看到String类的hashCode是通过对象的值来确定的,而String类中equals比较的就是值,而不是地址。这就保证了String重写equals时equals和hashCode的一致性。
我们来看一段代码:
public static void main(String[] args) {Object o1 = new Object();Object o2 = new Object();o1 = "sss";o2 = "sss";System.out.println(o1.equals(o2));System.out.println("o1.hashCode():" + o1.hashCode());System.out.println("o2.hashCode():" + o2.hashCode());}
结果为:
我们可以看到当equals相同时,对应的hashCode也是一样的,这就是equals和hashCode的一致性。为什么会存在这种一致性呢?那是因为像hashMap,hashSet这些集合框架,当你重写了equals方法而没有重写hashCode()时,可能会出现equals相同,而hashCode却是不同的,然后在这些集合框架对hashCode比较时,显示false,这和我们的预期存在差入。
@Overridepublic boolean equals (Object o) {if (o instanceof Student) {Student s = (Student) o;if (this.sName.equals(s.sName)) return true;else return false;}return false;}
public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();s1.setsName("sss");s2.setsName("sss");System.out.println(s1.equals(s2));System.out.println("s1.hashCode():" + s1.hashCode());System.out.println("s2.hashCode():" + s2.hashCode());}
结果为:
从结果看没重写hashCode()时,本来我们是想两个age相同的hashCode应该是一样,可hashCode是不同的地址。而如果是hashMap或hashSet这些集合框架时,就会产生了一些错误。像hashSet去重的话,我们是想将age相同的去重,但是从上面我们知道两个age相同,但hashCode不同,而去重是对hashCode的比较,最后也就达不到我们想要的去重效果。
@Overridepublic int hashCode () {return this.sName.hashCode();}@Overridepublic boolean equals (Object o) {if (o instanceof Student) {Student s = (Student) o;if (this.sName.equals(s.sName)) return true;else return false;}return false;}
public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();s1.setsName("sss");s2.setsName("sss");System.out.println(s1.equals(s2));System.out.println("s1.hashCode():" + s1.hashCode());System.out.println("s2.hashCode():" + s2.hashCode());}
结果为:
我们可以看到equals返回true,而且hashCode的地址也是一样的,这就符合之前所说的equals和hashCode的一致性。完美。这个时候你就没必要担心一些比较会出现问题了。所以说当你重写equals时,最好将hashCode也跟着一起重写。当然如果你非常确定你不会使用到hashCode比较,也是可以不重写hashCode的。
本文发布于:2024-02-01 10:52:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170675592836106.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |