具有相同引用的java字符串Concat?
这是我的代码,我现在对字符串池和 通过此输出堆存储
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");
}
}
现在,我正在创建字符串str
,并将存储在字符串池中(如果我出错,请更正!)。
现在,在使用字符串"abcd"
的concatstr1
之后,它们都具有相同的值。
所以,我认为str
和str1应该在字符串池中有相同的引用,所以第二个if
语句应该打印true
,但它打印false
那么,我的问题是为什么str和str1没有得到相同的参考
# 1 楼答案
对于比较值的字符串,我们应该使用equals方法,因为它比较字符串变量中存在的值
但是,当我们选择使用==比较字符串变量时,它会比较字符串对象的地址,而不是值,因此即使字符串对象中的值相同,它也会返回false
# 2 楼答案
Java自动地实习生(意味着将他们放入字符串池)字符串文本,而不是新创建的字符串。另见https://stackoverflow.com/a/1855183/1611055
请记住,字符串是不可变的,因此
+
运算符必须创建一个新字符串-它不能附加到现有字符串。在内部,+
操作符使用StringBuilder
来连接字符串。最终结果是通过StringBuilder.toString()
检索的,它实际上是return new String(value, 0, count);
此新创建的字符串不会自动放入字符串池
因此
str1
引用与str
不同,即使字符串具有相同的内容str
指向字符串池中的一个位置,而str1
指向堆上的一个位置如果你加上
在
str1 = str1 + "abcd";
显式插入新创建的字符串之后,第二个if
语句返回true
或者,
str1 = (str1 + "abcd").intern();
也会有同样的效果# 3 楼答案
将字符串添加到字符串池是正确的。但是==检查两个对象是否都指向字符串池中的同一引用(以便更简单地指向同一内存位置)。鉴于方法检查两个对象的值是否相同