这是我的代码,我现在对String pool和 通过此输出堆存储。
public class String1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "abcd";
String str1 = "" ;
str1=str1+"abcd";
if(str.equals(str1))
System.out.println("True");
else
System.out.println("False");
if(str == str1)
System.out.println("True");
else
System.out.println("False");
}
}
现在,我正在创建String str
并将存储在字符串池中(如果我出错了,请纠正我!)。
现在,在使用字符串str1
进行concat "abcd"
之后,它们都具有相同的值。
所以,我认为str
和str1在字符串池中应该具有相同的引用,因此,第二if
语句应该打印true
,但它会打印false
。
那么,我的问题为什么str和str1没有得到相同的参考?
答案 0 :(得分:5)
Java自动实习生(意思是,将它们放入字符串池)String literals ,而不是新创建的字符串。另请参阅https://stackoverflow.com/a/1855183/1611055。
请记住,字符串是不可变的,因此+
运算符必须创建一个新字符串 - 它不能附加到现有字符串。在内部,+
运算符使用StringBuilder
来连接字符串。最终结果通过StringBuilder.toString()
检索,基本上是return new String(value, 0, count);
。
这个新创建的String不会自动放入String池中。
因此str1
引用与str
不同,即使字符串具有相同的内容。 str
指向字符串池中的某个位置,而str1
指向堆上的某个位置。
如果你添加
str1 = str1.intern();
在str1 = str1 + "abcd";
显式实现新创建的String之后,第二个if
语句返回true
。
或者,str1 = (str1 + "abcd").intern();
具有相同的效果。
答案 1 :(得分:-1)
如果字符串要比较值,我们应该使用equals方法,因为它比较了字符串变量中存在的值。
但是当我们选择使用==比较字符串变量时,它会比较String对象的地址而不是值,因此即使它们具有相同的值,它也会返回false。
答案 2 :(得分:-2)
你是正确的,字符串被添加到字符串池。但是==检查两个对象是否指向字符串池中的相同引用(以使其更简单地指向相同的内存位置)。而.equals()方法检查对象的值是否相同。