0

在 Java 中创建 String 对象时,然后通过将其他内容连接到它

someString.concat("I am being concatenated to someString");

或者类似的,因为字符串是不可变的,所以会创建一个包含结果字符串的临时对象,对吗?通常,完成此操作后,会立即创建一个新的 String 对象来包含它,例如

String newString = oldString.concat("I am being concatenated");

但假设它不是。在那种情况下,是否有另一种方法来访问连接的字符串?(在最后一种情况下,oldString 和“我正在连接”的总和。)

4

4 回答 4

3

我会说不,因为您在堆空间中创建了一个新对象但没有引用它。所以它将被垃圾收集。在 Java 中,没有办法直接访问堆空间地址......

于 2012-09-26T07:14:53.537 回答
2

concat确实创建了一个新String对象(不确定您所说的临时对象是什么意思),如果您不将该新对象的引用存储String在变量中,则以后无法访问它。

在实践中:

someString.concat("I am being concatenated to someString");

在某个阶段(当/如果代码被 JIT 编译器编译时)可能会作为死代码被淘汰。

于 2012-09-26T07:12:16.443 回答
1

请参阅已接受的答案以获得正确答案,但疯狂的回复可能是......

someString.concat("I am being concatenated to someString").intern();
// later on later on in the code...
String s = new String("I am being concatenated to someString").intern();
于 2012-09-26T07:24:53.110 回答
0

Java 中非原始类型的变量是引用,它们不是对象本身(如在 C++ 中)。在这样的一行中:

String newString = oldString.concat("I am being concatenated");

没有创建一个新对象String其中复制了想象的临时字符串的内容。其实newString就是指你认为的临时对象。(实际上并没有临时对象)。

于 2012-09-26T07:12:45.067 回答