洽谈Object类中的equals和hashCode

DogJay 2017-06-08 后端技术 531人已围观

在昨天小编在twitter上面看到了一篇老外眼中的挑战。陌生的看来,真的是有点虚。其实,细细想来,又在装神弄鬼。首先,我们先看代码:

import java.util.LinkedHashMap; import java.util.Map; public class Main { public static void main(String ... doYourBest) { Map<Stark,String>map = new LinkedHashMap<>(); map.put(new Stark("one"),"1"); map.put(new Stark("two"),"2"); map.put(new Stark("three"),"3"); map.put(new Stark("four"),"4"); map.put(new Stark("five"),"5"); map.forEach((k,v)->System.out.println(v.toString())); } static class Stark{ String name; Stark(String name){ this.name = name; } public boolean equals(Object obj){ return ((Stark)obj).name.length() == this.name.length(); } public int hashCode(){ return 4000<<2*2000/10000; } } } 我们知道java中,一旦重写了equals()方法,那么我们一定会重写hashCode()方法,因为要保证,如果equals相等的两个对象, 那么他们的hashcode也要相等。所以要根据equals的实现规则重写hashCode方法。 Java中对equals的要求如下: 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。 反射性:x.equals(x)必须返回是“true”。 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。 一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。 Java中两个对象在进行比较时,比较equals方法的同时也要比较hasCode方法。所以在代码中: map.put(new Stark("one"),"1"); map.put(new Stark("two"),"2"); 通过这两行的map中添加值,如果两次赋值的key是一样的,那么第二次将会覆盖第一次的值,所以经过这两行的代码,map里面只有 一个键值对,即:<new Stark("two"),"2")>依次类推,所以最终,map中的键值对主要有三对,分别是: <new Stark("two"),"2"> <new Stark("three"),"3"> <new Stark("five"),"5"> 因此最终的值为:

吐槽(0)

文章评论

    共有0条评论

    验证码:

文章目录