从哈希码(hashCode)详解Java中equals和==的区别

一.什么是哈希码

在Java中,哈希码是一个对象的标识,根据不同的对象用不同的算法生成哈希码,如果两个对象不同哈希码也不相同

Object对象的哈希码根据对象的内存地址来生成,所以只要在内存中的地址不同,hashcode也不同

String引用类型的hashcode根据字符串里的内容由特殊算法来生成,字符串相同,hashcode也相同

Integer的哈希码就是对象里存储的数值,比如Integer a=100,则a的哈希码就是100

代码测试一下

结果如下图:
1000
100
false
false
true
str1:99162322
str2:99162322
str3:104818427
str4:99162322 

 有一条结果令人费解:str1和str2的hashcode相同,但是==结果不同(由于它们地址不相同,==最终还是比较的地址),可以得出这样一个结论,及时哈希码相同,对象也有可能不同,但是哈希码不同,对象一定不相同。

二.重写hashcode和equals方法

有些情况下需要重写hashcode方法和equals方法,比如购物网站重复添加商品到购物车时,前后即使是同一个商品,也会因对象不同而导致有了两条记录,再比如已有一个学生对象,从数据库取同一个学生对象进行==方法时返回的确实false,例如:

//学生entity

public class Student {
    private String id;
    private String name;
    public Student() {
        
    }
    
    public Student(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}

然后,写测试方法:

public class HashCodeTest {

    public static void main(String[] args) {
        Student s1=new Student("123456","lisi");
        Student s2=new Student("123456","lisi");
        System.out.println(s1.equals(s2));
    }

}
 

结果为:false 

此时就需要重写这两个方法。怎么去重写呢,假如说学生或者商品有一个唯一标识ID,我们可以通过以下方法重写,在student实体类中重写如以下:

由于student的id生成哈希码,相如果两个student的哈希码相同的话,那么id一定相同,然后看equals方法的重写

首先判断==结果是否为true,为true则代表地址相同,那么对象一定相同,直接返回true,否则判断是否为student的一个实例(instanceof用于判断是否为其实例)如果是的话先将对象强转为student对象,便于取其属性做判断,然后判断两者的属性值是否相同,相同则一定是相同对象,否则返回false,至此重写完成,重新测试,得到结果为true

猜你喜欢

转载自blog.csdn.net/qq_38162448/article/details/81638467
今日推荐