为什么两个字符串对象引用的串联不等于相同的内容字符串对象 [duplicate]

Why Concatenation of two string objects reference not equal to same content string object [duplicate]

提问人:Siva kumar 提问时间:5/16/2015 最后编辑:Mikheil ZhghentiSiva kumar 更新时间:10/21/2020 访问量:1841

问:

为什么下面的对象和对象不同,当尝试在字符串池中创建时,它会检查内容是否具有相同的内容,因此引用字符串池中的对象。但我的假设是错误的,那么任何人都会纠正我。s3s5Strings5s3s5s3

String s1 = "Buggy";
String s2 = "Bread";
       
String s3 = "BuggyBread";
      
String s4 = "Buggy" + "Bread"; 
String s5 = s1 + s2 
System.out.println(s3 == s4); // True
System.out.println(s3 == s5); //false
Java 字符串

评论

0赞 Oliver Charlesworth 5/16/2015
S5 不在字符串池中。
4赞 singhakash 5/16/2015
在此处阅读@Jon飞碟答案。 所以在池中,在堆中the string pool is only used for constant strings unless you call intern.s3s5

答:

9赞 M A 5/16/2015 #1
  1. String s4 = "Buggy" + "Bread";

    编译器足够聪明,可以意识到这只是 中已经引用的常量。换言之,引用与字符串池中的引用相同。BuggyBreads3s4Strings3

  2. String s5 = s1 + s2;

    在这里,编译器忠实地转换为变量内容的基于 -的串联,这会产生一个与 不同的引用。换句话说,这类似于:StringBuilders3

    StringBuilder sb = new StringBuilder(s1);     
    sb.append(s2);
    String s5 = sb.toString();
    
0赞 Minu Alex 5/16/2015 #2
 Just try this   
  String s = "Buggy";
  s = s.concat("Bread");
  System.out.println(s);