String str1 = "hello";
String str2 = "hello";
System.out.println(str1==str2);
System.out.println(str1.equals(str2));
输出结果为:true true
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str3 == str4);
System.out.println(str3.equals(str4));
输出结果为:false true
图一输出true的原因是:
使用字符串字面值创建字符串对象,Java 会首先检查字符串常量池,是否存在相同数值的字符串常量,如果有则会直接引用该字符串常量,而不会重新创建一个新的对象。指向的是同一个字符串对象。
图二输出false的原因是:
使用 new String()
构造方法会强制在堆内存中创建一个新的字符串对象,即使字符串常量池中已经存在相同数值的字符串常量。因此,str1 和 str2 分别指向堆内存中的两个不同的字符串对象。
“==”和equals()方法区别:
"==" 运算符:
- 在比较基本数据类型时,"==" 用于比较它们的值是否相等。
- 在比较引用数据类型时,"==" 用于比较它们在内存中的地址是否相同,即是否是同一个对象的引用。
equals() 方法:
- equals() 方法是 Object 类中定义的方法,在 Java 中所有类都继承自 Object 类,因此都可以使用 equals() 方法来比较对象的内容是否相等。