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字符串声明中的区别。

假设我有两个琴弦

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");
}


为什么str3str4没有引用同一对象?

最佳答案

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());


同样,方法的结果字符串(如substringreplacetoString)不会被中断。
这意味着您正在比较两个不同的实例(它们存储相同的字符),这就是==返回false的原因。

09-11 20:54