运行此代码时
String a="sa";
String s = "s";
String b=s + "a";
System.out.println(b==a);
打印错误。怎么样? b是新的String对象吗?
答案 0 :(得分:0)
您部分正确,如果表达式不是常量表达式,+
运算符 会创建一个新的String
对象。
根据Java语言规范Section 15.18.1,
(重点是我的)
§15.18.1字符串串联运算符
+
如果只有一个操作数表达式的类型为
String
,则字符串 对另一个操作数执行转换(第5.1.11节)以产生一个 运行时输入字符串。字符串连接的结果是对String对象的引用 这是两个操作数字符串的串联。那些角色 左操作数的放在右字符之前 新创建的字符串中的操作数。
String对象是新创建的(第12.5节),除非表达式是 常量表达式(第15.28节)。
通过常量表达式,其含义类似于:
"a" + "b" // this will always evaluate to "ab", so it's constant.
或
a + b
其中a
和b
被声明为final
。
有关详细信息,请参见§15.28。
答案 1 :(得分:0)
它会创建新字符串,因为您正在与对象实例连接。
如果要使用字符串池中已经存在的字符串,则应使用常量表达式进行连接。
如果您希望a == b为true,则应使用以下实习生:
String b= (s + "a").intern();
System.out.println(b==a);
或者您可以使用constans表达式:
String b= "s" + "a"
System.out.println(b==a);
它也会打印真实的