Java:字符串引用获得意外输出

时间:2012-09-28 07:51:42

标签: java string

我的代码是:

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

7 个答案:

答案 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(“溢出”);