Object 通用方法容易混淆的定义
先搞清楚各自的定义
- "==" 用来判断 相等
- equals() 用来判断 等价
- hashcode() 用来返回散列值
“==”相等
- 基本类型,判断两个值是否相等
- 引用类型,判断两个变量是否引用同一个对象
在Object中未被重写的定义
-
hashcode()是为默认对象的内存地址
-
equals() 比较对象的地址
是本地方法 c,c+语言直接返回对象的内存地址
equals() 等价
引用类型中判断引用的对象是否等价
public class equalExample{
private int x;
private int y;
private int z;
public equalExample(int x, int y, int z){
this.x=x;
this.y=y;
this.z=z;
}
@override
public boolean equals(Object o){
if(this.o==o) return true; // 引用同一个对象
if(o==null | getClass()!=o.getClass()) return false; // 检测是否同一个类型
// object 对象转型
equalExample that=(equalExample)o;
if(x!=that.x) return false;
if(x!=that.y) return false;
return z==that.z;
}
}
hashCode()返回散列值,而equals()用来判断两个对象是否等价
等价的两个对象散列值一定相同,相同的两个对象不一定等价
在覆盖equals()方法时应该总是覆盖hashCode()方法,保证等价的两个对象散列值也相等
// 实现equals重写,没有实现 hashcode重写
equalsExample e1=new equalsExample(1,1,1);
equalsExample e1=new equalsExample(1,1,1);
System.out.println(e1.equals(e2)); // true
HashSet<equalsExample> set=new HashSet<>();
set.add(e1);
set.add(e2);
System.out.println(set.size()); // 2