1. Object类
Object类是Java类继承的顶层,所有类继承自Object。
2. int hashCode() 和 boolean equals(Object obj)
hashCode():
- 这个方法返回对象的哈希码值,这个方法与哈希表的性能有关,它的实现方法是通过将对象在内存中所处于的位置转换成数字,这个数字就是hashCode。但是这个内存地址实际上java程序并不关心也是不可知的。这个地址是由JVM维护并保存的,所以实现是native的。
通用的约定 :
-
1>.在同个java环境下,相同的对象必须有同样的哈希码值;但是对于这个具体的整数值(哈希码)在两个相同应用下不需要一定要保持一致(后期会学到如何构建哈希表,一个对象在不同的哈希表下会有不同的哈希值)。
-
2>.如果两个对象通过equals方法是相等的,则他们的哈希值相同。
-
3>.反过来,如果两个对象通过equals方法是不相等的,他们的哈希值不一定不同。但是开发者应该明白,对于不相等的两个对象返回不同的哈希值会提高哈希表的性能。
equals() :
- 1>.判断两个对象是否相等,即对象的地址和对象的值,返回值是boolean值。
- 2>.在很多子类中,复写该方法之后,比较的是两个类的内容是否相同。
为什么重写equals()方法后还要重写hashCode()方法?
重写equals()方法不重写hashCode()方法:
- 创建一个用户类
public class User {
public String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return name.equals(user.name);
}
}
2.编写测试代码
public class ObjectDemo {
public static void main(String[] args) {
User user1 = new User();
User user2 = new User();
user1.name = "zhangsan";
user2.name = "zhangsan";
System.out.println(user1.equals(user2));
System.out.println(user1.hashCode());
System.out.println(user2.hashCode());
}
}
3.输出结果:equals为true,但是哈希码不一样
true
1163157884
1956725890
在看看重写equals()方法且重写hashCode()方法:
public class User {
public String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return name.equals(user.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
在运行main方法,结果:两个对象的哈希码一样
true
-1432604525
-1432604525
结论 : 保证equals返回true时,这两个对象有相同的哈希码值。