== 判断相等,判断的是物理地址相等。
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个对象的属性的值相等,则这两个对象就相等,需要重写equals方法。
自定义类,相等判断(根据属性的值),重写equals
class Man{private String name;public Man(String name) {this.name = name;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name);}
}
hashCode 如果不重写,则调用Object的hashCode 方法
public native int hashCode();
hashCode 与equals总是成对出现,java规范,如果两个对象通过equals判断相等, hashCode应该返回相同的哈希code码
// 方式一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方法,比较的是具体的值