从哈希码(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