为什么 str1 == str2 返回 false?
在 Java 中,== 运算符用于比较两个变量的内存地址(即是否指向同一个对象),而不是比较对象的内容。
代码分析
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false
new String("hello")创建新对象str1和str2分别指向两个不同的String对象,尽管它们的内容都是"hello"。- 每次
new都会在堆内存中创建一个新对象,即使内容相同。
==比较的是引用地址str1和str2存储的是不同的内存地址,所以str1 == str2返回false。
对比 equals() 方法
System.out.println(str1.equals(str2)); // true
String类重写了equals()方法,比较的是字符串内容,而不是内存地址。- 只要两个字符串的字符序列相同,
equals()就返回true。
特殊情况:字符串字面量(String Pool)
如果使用字符串字面量(而不是 new),情况会不同:
String s1 = "hello";
String s2 = "hello";
System.out.println(s1 == s2); // true
- 字符串常量池(String Pool) 会复用相同的字符串对象,所以
s1和s2指向同一个内存地址。 "hello"是编译期确定的,JVM 会优化存储,避免重复创建。
总结
| 比较方式 | 比较内容 | 示例 | 结果 |
|---|---|---|---|
== | 内存地址 | new String("hello") == new String("hello") | false |
equals() | 字符串内容 | new String("hello").equals(new String("hello")) | true |
字符串字面量 == | 常量池优化 | "hello" == "hello" | true |
关键点:
==比较的是对象地址,new会创建新对象,地址不同。equals()比较的是内容,String类已重写该方法。- 字符串字面量会复用常量池对象,所以
==可能返回true。
全部评论(0)
还没有任何评论哟~