说你有三个字符串,
String s1 = "string one"; String s2 = new String("string one"); String s3 = "string one";
我知道这是真的,s1 == s2是假的,但我读到s1 == s3的地方是真的.它是否正确?为什么或者为什么不?
解决方法
字符串文字自动被自动进行.所以s1 == s3是真的.字符串可以在字符串常量池中创建,也可以在堆空间中创建.如果你练习一个在堆中创建的字符串,字符串将在字符串常量池中.
当您创建一个字符串文字(String s1 =“string one”)时,字符串将在字符串常量池中创建.此外,字符串常量池不存储重复.所以当你说,
String s1 = "string one"; String s3 = "string one";
s1和s3都将指向字符串常量池中的字符串的相同实例.所以s1.equals(s3)将是真的.而s1 == s3也是如此;因为这两个指针是相同的.
但是,当您使用“new”构造函数实例化一个字符串
String s2 = new String("string one");
那么在堆空间中创建s2.堆空间是与字符串常量池不同的内存区域
所以当s1.equals(s2)为真时,s1 == s2为false;因为他们会指向不同的记忆区域.
但是,您可以转换使用“new”构造函数创建的字符串,以通过调用intern()函数将其移动到字符串常量池.所以s2.intern()将在字符串常量池中返回一个字符串;虽然s2最初是在堆中创建的.