java字符串连接和实习

标签 java string-concatenation string-interning

问题一

String a1 = "I Love" + " Java";
String a2 = "I Love " + "Java";
System.out.println( a1 == a2 ); // true

String b1 = "I Love";
b1 += " Java";
String b2 = "I Love ";
b2 += "Java";
System.out.println( b1 == b2 ); // false

在第一种情况下,我知道它是两个字符串文字的串联,因此结果“I Love Java”将被保留,给出结果 true。但是,我不确定第二种情况。

问题2

String a1 = "I Love" + " Java"; // line 1
String a2 = "I Love " + "Java"; // line 2

String b1 = "I Love";
b1 += " Java";
String b2 = "I Love ";
b2 += "Java";
String b3 = b1.intern();
System.out.println( b1 == b3 ); // false

上面返回false,但是如果我注释掉第1行和第2行,它返回true。这是为什么?

最佳答案

问题的第一部分很简单:Java 编译器将多个字符串文字的串联视为单个字符串文字,即

"I Love" + " Java"

"I Love Java"

是两个相同的字符串文字,它们被正确地驻留。

相同的驻留行为适用于字符串的+=操作,所以b1b2是实际上是在运行时构建的。

第二部分比较棘手。回想一下,b1.intern() 可能会返回 b1 或与其相等的其他一些 String 对象。当您保留 a1a2 时,您会从对 b1.intern() 的调用中得到 a1。当您注释掉 a1a2 时,没有要返回的现有副本,因此 b1.intern() 返回给您 b1 本身。

关于java字符串连接和实习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45165496/

相关文章:

c++ - 如何在 C++ 中为任意数量的字符串连接编写可变参数函数

python - 连接矩阵中的字符串python

javascript - 使用 jQuery 的简单字符串和变量问题

c# - 为什么 .NET 创建新的子字符串而不是指向现有字符串?

java - Java 中的简单文本格式,例如上标?

java - 如何在 Java SE 环境中部署 JAX-RS 应用程序?

java - HashMap<String,Value>.remove() 通过在 Key 上使用 String.intern() 同步,这是否有效?或者这是损坏的代码?

java - "java"与 intern() 的字符串比较为假

java - 每个类如何继承Object类?

Java Color(int rgba) 构造函数和 int 溢出