This question already has answers here:
Comparing strings with == which are declared final in Java
(6个答案)
What is the difference between these two ways of initializing a String?
(3个答案)
5年前关闭。
我无法识别以下Java字符串声明中的区别。
假设我有两个琴弦
之间有什么区别
和
在以上两个声明中,
假设我创建一个新字符串
然后在上述任何声明中,
为什么
和
同样,方法的结果字符串(如
这意味着您正在比较两个不同的实例(它们存储相同的字符),这就是
(6个答案)
What is the difference between these two ways of initializing a String?
(3个答案)
5年前关闭。
我无法识别以下Java字符串声明中的区别。
假设我有两个琴弦
String str1="one";
String str2="two";
之间有什么区别
String str3=new String(str1+str2);
和
String str3=str1+str2;
在以上两个声明中,
str3
的内容均为onetwo
。假设我创建一个新字符串
String str4="onetwo";
然后在上述任何声明中,
if(str4==str3) {
System.out.println("This is not executed");
}
为什么
str3
和str4
没有引用同一对象? 最佳答案
str1 + str2
用于非编译常量字符串将被编译为new StringBuilder(str1).append(str2).toString()
。此结果将不会被放置,也不会从字符串池中获取(内部字符串存放的地方)。
在"foo"+"bar"
情况下,情况有所不同,在该情况下,编译器知道他使用的值,因此他可以将该字符串连接一次,以避免在运行时使用它。这样的字符串文字也将被保留。
所以String str3 = str1+str2;
与
String str3 = new StringBuilder(str1).append(str2).toString();
和
String str3 = new String(str1+str2);
与String str3 = new String(new StringBuilder(str1).append(str2).toString());
同样,方法的结果字符串(如
substring
,replace
,toString
)不会被中断。这意味着您正在比较两个不同的实例(它们存储相同的字符),这就是
==
返回false
的原因。09-11 20:54