一、==
== 判断相等,判断的是物理地址相等。
二、equals 判断相等
equals 与hashCode 都是Object的方法。
所有的类都继承于Object,如果不重写equals。equals判断相等,底层也是使用==来判断物理地址相等。
public boolean equals(Object obj) {
return (this == obj);
}
与equals伴随的是hashCode方法。(hashCode也是Object的方法)
public native int hashCode();
hashCode返回的不是地址值,而是与地址相关的一个值,它也是唯一的,地址发生改变,hashCode码也会发生变化。
2.1 自定义类,equals判断相等
我们自定义了一个类,要求:如果2个对象的属性的值相等,则这两个对象就相等,需要重写equals方法。
自定义类,相等判断(根据属性的值),重写equals
class Man{
private String name;
public Man(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Man man = (Man) o;
return Objects.equals(name, man.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
2.2 hashCode
hashCode 如果不重写,则调用Object的hashCode 方法
public native int hashCode();
hashCode 与equals总是成对出现,java规范,如果两个对象通过equals判断相等, hashCode应该返回相同的哈希code码
三、String字符串判断相等
// 方式一
String name = "acd";
这个产生的数据,在jvm的常量池中。
// 方式二
String name1 = new String("acd");
这种方式,产生的数据,存放在jvm的堆中。
做相等判断
System.out.println(name == name1);
System.out.println(name.equals(name1));
打印结果:
false
true
==,判断不相等,因为物理地址不一样,一个在常量池中,一个在堆中。
equals判断相等,因为字符串重写了equals方法,比较的是具体的值