我的代码是:
String str = "Hello";
String str1;
str1 = str;
str1 = str1 + " World";
System.out.println(str1);
System.out.println(str);
我得到的输出是:
Hello World
Hello
对于这两种情况,我期望的输出是Hello World
,因为根据我在str1 = str
之后的理解,两个对象都引用了相同的位置,因此如果我更改一个对象的内容,其他对象也会受到影响
那么,str1 = str1 + " World";
是否在不同的内存位置创建一个新的字符串对象。?
答案 0 :(得分:7)
字符串是不可变的。执行str1 = str1 + " World";
时,您将创建一个全新的字符串并更新str1
对它的引用。你永远不会重新定位str
所以这是预期的行为。
答案 1 :(得分:4)
关键是+
运算符创建一个新的String对象,有效地连接操作数。它不会修改对象str
。
你可能想阅读http://javarevisited.blogspot.co.at/2010/10/why-string-is-immutable-in-java.html,它很好地解释了不可变字符串的概念。
类StringBuffer
也许值得注意,它针对长级联级联合进行了优化。
答案 2 :(得分:3)
在Java中,String是不可变的。
str1 = str1 + " World";
它将创建一个新实例并分配给str1。
答案 3 :(得分:3)
java.lang.String是不可变的
str1 = str1 + " World";
此代码将使str1引用新创建的String对象"Hello World"
,并且str仍然引用"Hello"
对象。
答案 4 :(得分:2)
对原始日期类型的引用始终会创建一个新对象
答案 5 :(得分:1)
不,这是你在初始化字符串
的代码中的正确输出String str = "Hello";
String str1;
然后你说
str1 = str;
表示str1
包含“Hello”
str1 = str1 + " World";
上面的行将打印“Hello World”,因为str1
有“Hello”和“World”作为新字符串给出
当您打印str
时,它包含单词“Hello”
System.out.println(str);
答案 6 :(得分:0)
这里的String有什么特别之处,这是所有人的共同行为。它是关于赋值运算符的(在第4行,您再次分配它)。您的代码与下面的代码类似。
Person p1 = new Person("Stack");
Person p2;
p2 = p1;
p1 = new Person("OverFlow");
这会打印什么?两者都打印“溢出”吗?
从你的话来说。
我期待的输出是两个案例的Hello World,因为 根据我的理解, str1 = str后两个对象都是 引用相同的位置所以,如果我更改一个对象的内容 其他人也应该受到影响。
Line 3: str1 = str;
根据第3行,你是对的。
Line 4: str1 = str1 + " World";
但在第4行中,您没有更改内容,而是将str1重新分配给其他对象。
这里str,str1和p1是Object引用。不是真正的物体。如果要更改对象,则会获得相同的内容。像
p1 = p1.setName(“溢出”);