论equals(Object o)方法和hashCode()方法

equals(Object o)方法

1.作用,比较两个数据是否相同
2.为什么要重写equals方法
由于Object类是所有类的父类,当没有重写equals方法时,使用的是Object类的equals方法(有些类底层重写了equals方法 eg:String类底层重写了equals方法)
Object类的equals方法

public boolean equals(Object obj) {
    return (this == obj);
}

在有些时候,这个父类方法并不能满足需求
eg:我们认为学号和名字相同就是一个人

package text2;
public class student {
    int id;
    String name;

    public student(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
}
package text2;

public class Main {
    public static void main(String[] args) {
        student student1=new student(1,"小明");
        student student2=new student(1,"小明");
        System.out.println(student1.equals(student2));
    }
}

结果是控制台最后输出的是false;
因为没有重写equals方法,所以调用的是父类的equals方法,
所以
System.out.println(student1.equals(student2));
等于
System.out.println(student1==student2);
他们比较的是student1和student2对象所指向的地址,他们的所指向的地址不同,当然就是false;
此时我们需要在student 类中重写equals方法

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    student student = (student) o;
    return id == student.id &&
            Objects.equals(name, student.name);
}

此时运行Main类,比较的是学号和名字,只有学号和名字都相同则为true
最后运行结果为true;

hashCode()方法

作用:返回某个数据的hash值
1.hash值有什么用?
以一个只能存储不同元素的集合为例
如何保证集合中元素的唯一性
方案一:很多人可能惯性认为,每添加一个元素,就遍历一下集合,在遍历过程中顺便用添加元素的equals方法来和遍历的数据进行比较;可以达到目的,但假如数据大了,非常影响添加元素的速度
方案二:利用hash值存储元素:当存储下一个元素时,利用该元素的hash值来找到存储位置,如果该位置有元素,则利用该元素的equals方法来判断是否为相同元素,如果是则不存,如果不是则重新计算不一样的hash值,再次利用hash值存储该元素;
2.为什么要重写equals方法时也要重写hashCode()方法;
以student为例:我们认为id相同的学生数据为同一数据,
按照上面的equals方法讲解,我们需要重写该类的equals方法
(没有重写hashCode方法)

package text2;
public class student {
    int id;
    String name;

    public student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        student student = (student) o;
        return id == student.id;
    }

    @Override
    public String toString() {
        return "student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

然后我们把两条学生数据添加进HashSet集合

public static void main(String[] args) {
    student student1=new student(1,"小明");
    student student2=new student(1,"小红");
     HashSet<student>students=new HashSet<>();
    students.add(student1);
    students.add(student2);
    System.out.println(students);
}

最后结果是
[student{id=1, name=‘小红’}, student{id=1, name=‘小明’}]
按照要求应该id相同就是同一数据
为什么student1和student2都会添加进来?
因为student没有重写hashCode()方法,所以使用的是父类Object的hashCode()方法
student1和student2算出的hash值不同,所以会认为是不同数据
解决方法:重写hashCode()

@Override
public int hashCode() {

    return Objects.hash(id);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值