0

鉴于此代码:

String first = "Hello world";

String second = first;

first = "Something else";

执行后,变量会指向与第一次赋值second中变量指向的内存实例相同的内存实例first(相同的“Hello world”)还是完全不同的内存区域(另一个内存区域也显示“Hello world”) ?

我想知道在第二行 (String other = originalString) 中进行多个分配是否会导致任何性能损失,或者它是否与分配任何其他对象一样快。

4

3 回答 3

10

执行后,变量 second 将指向变量在第一次赋值中首先指向的相同内存实例(相同的“Hello world”)还是完全不同的内存区域(另一个内存区域也显示“Hello world” “)?

相同的内存区域。

这是您在每个阶段所拥有的:

String first = "Hello world";

给你:

+-------+ +--------------+
| 第一个|---------->| “你好世界” |
+-------+ +--------------+

然后

String second = first;
+--------+
| 第二个|----\
+--------+ | +---------------+
               +---->| “你好世界” | (与上面相同的内存)
+--------+ | +---------------+
| 第一个 |----/
+--------+

然后

first = "Something else";
+--------+ +----------------+
| 第二个|---------->| “你好世界” | (与上面相同的内存)
+--------+ +----------------+
+--------+ +------------------+
| 第一个|---------->| “别的东西” |
+--------+ +------------------+
于 2013-08-04T12:54:36.523 回答
2

其次是参考变量。像任何引用变量一样,将其分配给另一个变量只会导致复制引用,而不是对象。这两个引用变量指向同一个内存。

我想知道在第二行 (String other = originalString) 中进行多个分配是否会导致任何性能损失,或者它是否与分配任何其他对象一样快。

您没有分配对象;您正在分配对对象的引用。复制对字符串的引用并不比复制任何其他引用更昂贵。复制引用变量非常便宜。通常,您可以根据可读性和可理解性的需要复制参考值,而不会显着影响性能。

于 2013-08-04T12:51:41.543 回答
1

字符串文字在 java 中是不可变的。一旦创建了字符串文字,它就不能被修改并存储在字符串常量池中。以下是它在您的情况下的工作方式:

String first = "Hello world";

新字符串将在常量池上创建,“first”将指向它。

String second = first;

第一个和第二个引用都指向同一个字符串对象。

first = "Something else";

在这种情况下,不会修改字符串对象“Hello world”。相反,将创建一个新对象“其他东西”,并且“第一”将开始指向它。而“第二个”引用一直指向对象“Hello world”。

现在假设您创建了一个新的引用,如下所示:

String third = "Something else";

引用 'third' 也将开始指向与 first 相同的对象,即使您没有使用 '=' 运算符将 first 的引用值分配给它。

于 2013-08-04T13:06:44.887 回答