为什么两个字符串对象的连接引用不等于相同的内容字符串对象

为什么s3s5 String对象不同,当s5尝试在String池中创建时,它检查内容s3已经有相同的内容,所以s5引用字符串池中的s3对象。 但我的假设是错误的,那么任何人都应该纠正我。

  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 

  1. String s4 = "Buggy" + "Bread";

    编译器很聪明,意识到这只是在s3引用的常量BuggyBread 。 换句话说, s4引用与字符串池中的s3相同的String

  2. String s5 = s1 + s2;

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

     StringBuilder sb = new StringBuilder(s1); sb.append(s2); String s5 = sb.toString(); 
  Just try this String s = "Buggy"; s = s.concat("Bread"); System.out.println(s);