重写hashCode或equals
前言
今天突然想到Object的两个方法,equals和hashcode。这两个方法是javase的内容,当初初学java也只是了解过,如今想起来感觉一无所知。
上网搜了搜hashcode和equals的使用场景,搜到了csdn一篇博客,通俗易懂,顺便记录一下自己的学习笔记
博客链接:https://blog.csdn.net/u012557538/article/details/89861552
另一篇博客园的博客链接:https://www.cnblogs.com/keyi/p/7119825.html
par1:hashcode和equals有什么用
hashcode方法可以返回一个对象的哈希值,这和哈希存储有关,哈希值是通过某种函数计算出的对象的存储地址。(不太熟悉的可以看看数据结构的哈希表)
equals方法:比较两个对象的引用地址是否相等,相等返回true,否则返回false
引用于博客园博客的原话
hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?
因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?
因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
part2:重写equals的使用场景
一般,我们创建自定义对象,比如创建一个User对象(设只有name,age两个成员),我们判断两个对象是否相等,就是看name和age是否都相等,这时候如果我们不重写equals方法,那么即使name和age都相等,返回值也不是我们想要的true。这时我们就要重写equals方法,把比较引用地址改为比较参数
public class TestEquals {
public static void main(String[] args) {
User u1 = new User("yfm", 21);
User u2 = new User("yfm", 21);
System.out.println(u1.equals(u2));//false
}
}
class User{
private String name;
private Integer age;
public User(String name,Integer age){
this.name=name;
this.age=age;
}
}
part3:重写hashcode的使用场景
我们知道,set是无序不重复集合,Map是无序的,且Map的键是不能重复的。
而判断是否重复,使用的就是hashcode方法。
所有这时,若Map的键的类型是自定义对象,我们就要重写该对象的hashcode方法,来保证比较的是内容而不是地址
如何比较:
博客链接:https://blog.csdn.net/u012557538/article/details/89861552
这篇博客写的比较细致,建议观看

浙公网安备 33010602011771号