public class test {
public static void main(String[] args) {
String name1 = "zzz";
String name2 = "zzz";
String name3 = new String("zzz");
// hashCode() 方法:基于字符串的内容计算哈希值,因此内容相同的字符串对象其 hashCode() 值也相同
System.out.println("name1哈希码: " + name1.hashCode()); // 121146
System.out.println("name2哈希码: " + name2.hashCode()); // 121146
System.out.println("name3哈希码: " + name3.hashCode()); // 121146
// 因为 == 运算符用于比较两个引用是否指向同一个对象,而不是比较对象的内容
System.out.println(name1 == name2); // true, 因为name1 和 name2 都被赋值为字符串字面量 "zzz"。由于字符串字面量会被存储在字符串常量池中,所以 name1 和 name2 都会引用常量池中的同一个字符串对象 zzz
System.out.println(name3 == name2); // false, 因为name3和name2指向不同的对象。name3是通过new创建的一个新String对象(调用了构造方法创建新的类对象)
// 更具体的:尽管 "zzz" 是一个字面量并且可能已经存在于字符串常量池中,new 关键字强制 JVM 创建一个新的字符串对象,并且这个新对象存储在堆内存中,而不是常量池中。因此,这个新对象与常量池中的对象是不同的。
// equals 方法来比较字符串内容时,无论字符串是如何创建的,只要内容相同,equals 方法都会返回 true
System.out.println(name1.equals(name2)); // true
System.out.println(name3.equals(name2)); // true
}
}
结果: