Java JDK如何在字符串池中创建新字符串

Java JDK如何在字符串池中创建新字符串,java,string,runtime,string-pool,Java,String,Runtime,String Pool,我了解到,当您使用字符串分配值时,它将使用字符串池。所以,他们使用相同的地址 String S1 = “Hello World”; String S2 = “Hello World”; String S3 = “Hello”; String S4 = “ World”; System.out.println(S1 == S2); // Returns true 但当我试着做以下事情时 S3 = S3 + S4; 并用S1检查地址 System.out.println(S1 == S3);

我了解到,当您使用字符串分配值时,它将使用字符串池。所以,他们使用相同的地址

String S1 = “Hello World”;
String S2 = “Hello World”;

String S3 = “Hello”;
String S4 = “ World”;

System.out.println(S1 == S2); // Returns true
但当我试着做以下事情时

S3 = S3 + S4;
并用S1检查地址

System.out.println(S1 == S3); // Returns false
为什么它返回false?为什么JDK不使用与S1或S2相同的地址


谢谢

这个问题的解释是:这里需要记住的重要一点是,实习只对常量表达式有效<代码>“Hello World”是一个常量,但
S1
不是,除非
S1
变量是
final
。这意味着
S3+S4
不是一个常数(因此不会被插入),除非S3和S4都是常数——但当然,如果S3是最终的,那么
S3=S3+S4
就不会编译。我不确定你想知道什么,因为使用“=”将两个字符串相互比较没有实际意义。如果要比较字符串的内容,请使用s1.equals(s3)。它将返回一个布尔值(true或false)。强调@AlexanderHeim的观点:这当然是Java的一个有趣的因素,作为一个思维练习很好地理解——但它几乎从来都不是你想要依赖(甚至关心)的东西。对于日常比较,只需使用
equals
,您就会很高兴.System.out.println(S1==S3.intern())//true当对字符串对象调用intern()方法时,它会在池中查找此字符串对象包含的字符串,如果在池中找到该字符串,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。