- “==” 对比两个对象的内存地址。
- equals()方法与 “==” 效果默认相同,即对比内存地址,除非 equals() 方法在类中被重写(Override),则对比是走重写后的方法进行对比
obj.hashCode()
可以被覆写,使用System.identityHashCode(obj)
读取对象的内存地址,且永远不会变
实例代码如下
package com.shh.base;
import java.util.Objects;
public class equal {
public static void main(String[] args) {
Scout scout = new Scout("小杨");
Scout scout1 = new Scout("小杨");
//将 scout 对象赋给 scout2,实际 scout2 和 scout 指向了同一个对象
Scout scout2 = scout;
System.out.println(scout == scout2); //true
// 因为指向同一个对象,所以 当 scout2的name属性被改变时, scout的对象的也同样改变。
scout2.name = "小李";
System.out.println(scout.name);
//因为覆写了 hashCode 方法,所以三个对象得出的结果一样
System.out.println(scout.hashCode());
System.out.println(scout1.hashCode());
System.out.println(scout2.hashCode());
//只要是不同的对象,使用System.identityHashCode 方法获取的hasCode一定不一致,且不会因为 hashCode方法被覆写而变化
System.out.println(System.identityHashCode(scout));
System.out.println(System.identityHashCode(scout1));
System.out.println(System.identityHashCode(scout2));
//因为 scout 和 scout1 两者的内存地址不一样, 所以为false
System.out.println(scout == scout1);
//因为equals()方法被覆写,新方法以name 属性的值进行哈希比较, 因为两个对象name属性值相同,所有对比结果为true
System.out.println(scout.equals(scout1));
}
}
class Scout {
public String name;
public Scout(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Scout scout = (Scout) o;
return Objects.equals(name, scout.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
两种 String 实例化方式的区别
通过下面的例子可以看到,两种 String对象初始化的区别。
public class HashSet01 {
@SuppressWarnings("all")
public static void main(String[] args) {
String name = "李四";
String name2 = "李四";
System.out.println(name.hashCode());
System.out.println(name2.hashCode());
System.out.println(System.identityHashCode(name));
System.out.println(System.identityHashCode(name2));
System.out.println(name2 == name);// name 和name2 由于内存地址相同,即是同一个对象, 返回true
System.out.println(name2.equals(name));
//再看另外一种方法,new String()
String p1 = new String("张三");
String p2 = new String("张三");
System.out.println(p1.hashCode());
System.out.println(p2.hashCode());
System.out.println(System.identityHashCode(p1));
System.out.println(System.identityHashCode(p2));
System.out.println(p1 == p2); // 这两个不是的对象,内存地址不一样,所以 返回false
System.out.println(p1.equals(p2)); // String的equals方法判断的结果
}
}
注意: String对象,如果内容相同,即字符串相同,那么 hashCode 得出的值是一致的,但是通过 System.identityHashCode 获取的内存地址不一致,所以是不同的对象
将内容相同的两个 String 对象写入HashSet 时,由于 hashCode一致, 且通过 equals方法计算的结果一致,所以,即便是通过 new String() 创建的对象,只要内容相同,还是不能重复写入。
转载请注明:大后端 » Java 基础 equals() 与 “==” 的区别