【发布时间】:2016-04-16 13:55:28
【问题描述】:
import java.lang.String;
public class Test {
public static void main(String[] args) {
String a1="ka";
String a2="ka";
System.out.println("a1==a2? "+(a1==a2));
String a3="k";
String a4=new String("k");
System.out.println("a3==a4? "+(a3==a4))
System.out.println("a3==a4? "+(a3==a4.intern()));
String a5="k";
String a6=a4+"a";
System.out.println("a1==a6? "+(a1==a6));
}
}
我得到的输出:
a1==a2? true
a3==a4? false
a3==a4? true
a1==a6? false
- a1===a2 为真,因为第 5 行不会在字符串池区域中创建新的字符串文字。仅返回对先前创建的字符串的引用。
- a3==a4? false as a4 将引用字符串对象而不是字符串池区域中字符串中的字符串。我的问题是,如果 a3 引用的是字符串常量而不是 String 对象,它如何能够使用 String 类的方法?
- a4.intern() 将返回对字符串池中字符串的引用,该字符串恰好与a3 相同
- a6=a4+"a" 将创建一个新字符串 "ka"。但这实际上利用了 StringBuilder 类及其 append 方法。然后使用 toString() 将其转换为字符串。此进程是否将新创建的字符串“ka”存储在字符串池区域中?由于字符串已经在池中,第 12 行的代码应该返回对它的引用。所以 a1==a6 应该是 true.rt? 我是java新手。请指导我在哪里做错了?
【问题讨论】:
-
这是“奇怪”行为的答案......stackoverflow.com/a/35899981/982161
-
a6=a4+"a"将在堆上创建一个新的字符串ka,而不管字符串常量池中是否存在"ka"。此引用将用于与字符串池中的"ka"进行比较,因此您将得到错误。请注意,当您执行此操作时,"a"将被添加到字符串常量池中。 -
@smasher 可能是因为这个问题每天至少被问一次。
-
我知道 == 比较引用而不是比较字符串的内容..
-
@TheLostMind 你能否详细说明为什么新字符串将在堆中创建,而不是在通常存储字符串文字的字符串池区域中创建.. 是否由于 + 运算符在内部使用 StringBuilder 类及其方法?