1

这是 Java String 101 的一部分。我最近在一些现有代码中遇到了这个问题。我最初的反应是这是多余的

car.setDetails(new String(someStringBufferObj.toString));

在我看来,即使这也是多余的......

car.setDetails(new String(someOtherStringObj));

因为 String 是不可变的,所以永远不会有someOtherStringObj在后面的代码行中意外(通过更改)更改汽车详细信息的风险

我错了吗?

4

2 回答 2

2

上面的第一个片段看起来没有必要。然而,第二个可能是必要的。考虑以下。

构造函数String(String)很有用,因为它将获取原始字符串的底层字符数组的副本

为什么这很有用?您必须了解字符串对象具有其下的字符数组,并且获取substring()现有字符串的 a 实际上使用该原始字符数组。这是一种享元模式。考虑以下

String s = longstring.substring(2,4);

字符串s指向底层的字符数组longstring(有点不直观)。如果你想装箱longstring(使用垃圾收集)底层字符数组将不会被装箱,因为s它仍然引用它,你最终会为 2 个字符串消耗大量内存。

构造String(String)函数通过从用于构造的字符串所引用的字符数组创建一个新的字符数组来解决此问题。当通过垃圾回收删除原始字符串时,其字符数组将不会被substring()结果引用,因此也将被删除。

请注意,这种行为最近在 Java(我认为是 7u4 版)中发生了变化,并且字符串不再支持上述操作模式。

于 2013-02-13T14:38:59.497 回答
0

你说得对,Rob,在这种情况下不需要新建一个字符串。只需调用 someStringBufferObj.toString() 就足够了!

于 2013-02-13T14:37:39.763 回答