0

我的代码是:

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";在不同的内存位置创建一个新的字符串对象吗?

4

7 回答 7

7

字符串是不可变的。当你这样做时str1 = str1 + " World";,你正在创建一个全新的 String 并更新str1对它的引用。你永远不会重新分配str,所以这是预期的行为。

于 2012-09-28T07:55:35.530 回答
4

关键是该+运算符创建了一个新的 String 对象,有效地连接了操作数。它不修改对象str

您可能想阅读http://javarevisited.blogspot.co.at/2010/10/why-string-is-immutable-in-java.html,它很好地解释了不可变字符串的概念。

该类StringBuffer也可能值得注意,它针对长的级联连接进行了优化。

于 2012-09-28T07:56:15.420 回答
3

在 Java 中,字符串是不可变的。

str1 = str1 + " World";它将创建一个新实例并分配给 str1。

于 2012-09-28T07:55:12.273 回答
3

java.lang.String 是不可变的

str1 = str1 + " World";

此代码将使 str1 引用新创建的 String 对象"Hello World",而 str 仍然引用该"Hello"对象。

于 2012-09-28T07:57:30.860 回答
2

对原始日期类型的引用总是会创建一个新对象

于 2012-09-28T07:58:21.253 回答
1

不,这是你初始化字符串的代码中的正确输出

String str = "Hello";
 String str1;

然后你说

str1 = str;

这意味着str1包含“你好”

str1 = str1 + " World";

上面的行将打印“Hello World”,因为str1那里有“Hello”和“World”作为新字符串

当您打印时str,它包含“你好”这个词

System.out.println(str);
于 2012-09-28T07:57:41.457 回答
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 是对象引用。不是真实的物体。如果您更改对象,您将获得相同的内容。像

p1 = p1.setName("溢出");

于 2012-09-28T08:36:06.450 回答