== 判断相等,判断的是物理地址相等。
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;
- }
-
- @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);
- }
- }
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方法,比较的是具体的值
