equals()与hashcode()之间的关系 爱被打了一巴掌 2023-10-09 15:18 26阅读 0赞 ### 1、equals简介 ### 被用来检测两个对象是否相等,即两个对象的内容是否相等; equals 方法(是String类从它的超类Object中继承的)==用于比较引用和比较基本数据类型时具有不同的功能: 比较基本数据类型,如果两个值相同,则结果为true; 而在比较引用时,如果引用指向内存中的同一对象,结果为true。 ### 2、hashcode简介 ### 哈希码(HashCode)通过hash函数得来的,并不是完全唯一的,它是一种算法 ### 3、hashcode和equals之间的关系 ### 在Java中,每个对象都可以调用自己的hashCode方法得到自己的哈希值(hashCode),相当于对象的指纹信息,通常来说世界上没有完全相同的两个指纹,但是在Java中做不到这么绝对,但是我们仍然可以利用hashCode来做一些提前的判断,比如: * 如果两个对象的hashCode不相同,那么这两个对象肯定不同的两个对象 * 如果两个对象的hashCode相同,不代表这两个对象一定是同一个对象,也可能是两个对象 * 如果两个对象相等,那么他们的hashCode就一定相同 在Java的一些集合类的实现中,在比较两个对象是否相等时,会根据上面的原则,会先调用对象的`hashcode()`方法得到`hashCode`进行比较,如果hashCode不相同,就可以直接认为这两个对象不相同,如果hashCode相同,那么就会进一步调用`equals()`方法进行比较。而`equals()`方法,就是用来最终确定两个对象是不是相等的,通常equals方法的实现会比较重,逻辑比较多,而hashCodel()主要就是得到一个哈希值,实际上就一个数字,相对而言比较轻,所以在比较两个对象时,通常都会先根据hashcode相比较一下。 我们通过一个例子来分析下: > User类: > 重写了equals方法 public class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return user.getName().equals(this.name); } } > 测试类: public class HashAndEquals { public static void main(String[] args) { HashMap<User, String> map = new HashMap<>(); map.put(new User("lp"), "123"); System.out.println(map.get(new User("lp"))); } } ![在这里插入图片描述][6ea756c8f99b4b7dbab7a14371f7bc67.png]按理来说:应该的到123,但是却得到一个null; 因为在get的时候,会首先去判断两个User对象的hashcode,相同之后才会调用equals方法去比较 ![在这里插入图片描述][d9f481ab6f31415bb1e722d512155f02.png]我们添加重写的hashcode,运行测试,能够获取到对应的值 @Override public int hashCode() { return name.hashCode(); } ![在这里插入图片描述][86df3f0c6092440e8bddd6aaa1bd39dd.png] 所以我们就需要注意,如果我们重写了equals()方法,那么就要注意重写hashCode()方法,一定要保证能遵守上述规则。 [6ea756c8f99b4b7dbab7a14371f7bc67.png]: https://img-blog.csdnimg.cn/6ea756c8f99b4b7dbab7a14371f7bc67.png [d9f481ab6f31415bb1e722d512155f02.png]: https://img-blog.csdnimg.cn/d9f481ab6f31415bb1e722d512155f02.png [86df3f0c6092440e8bddd6aaa1bd39dd.png]: https://img-blog.csdnimg.cn/86df3f0c6092440e8bddd6aaa1bd39dd.png
还没有评论,来说两句吧...