在Java中创建String对象时,然后通过
连接其他内容someString.concat("I am being concatenated to someString");
或者其中一些,因为字符串是不可变的,所以创建了一个包含结果字符串的临时对象,对吗? 通常,完成此操作后,会立即创建一个新的String对象以包含它,类似于
String newString = oldString.concat("I am being concatenated");
但是假设事实并非如此。在这种情况下,是否有另一种方法来访问连接字符串? (在最后一种情况下,oldString和“我正在连接”的总和。)
答案 0 :(得分:3)
我会说不,因为你在堆空间中创建了一个新对象但没有引用它。所以它将被垃圾收集。在Java中,没有办法直接访问堆空间地址......
答案 1 :(得分:2)
concat
确实创建了一个新的String
对象(不确定临时意味着什么),如果你没有将新String
的引用存储在一个变量中以后你无法访问它。
在实践中:
someString.concat("I am being concatenated to someString");
在某些阶段(如果代码由JIT编译器编译),可能会被删除为死代码。
答案 2 :(得分: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();
答案 3 :(得分:0)
Java中非基本类型的变量是引用,它们本身不是对象(如在C ++中)。在这样的一行:
String newString = oldString.concat("I am being concatenated");
创建了不新的String
对象,其中复制了想象的临时字符串的内容。事实上,newString
将引用您认为的临时对象。 (没有真正的临时对象)。