这是一些Java String 101.我最近在一些现有代码中遇到过这个问题。我最初的反应是这是多余的
car.setDetails(new String(someStringBufferObj.toString));
在我看来即使这也是多余的 ......
car.setDetails(new String(someOtherStringObj));
因为String是不可变的,所以在以后的代码行中不会有意外更改汽车细节(通过更改someOtherStringObj
)的风险
我错了吗?
答案 0 :(得分:2)
上面的第一个代码段看起来没必要。然而,第二个可能是必要的。请考虑以下事项。
构造函数String(String)
很有用,因为它将获取原始字符串的基础字符数组的副本。
为什么这有用?您必须了解字符串对象在其下面有一个字符数组,并且获取现有字符串的substring()
实际上使用该原始字符数组。这是flyweight pattern。请考虑以下
String s = longstring.substring(2,4);
字符串s
指向longstring
下面的字符数组(有点不直观)。如果你想要bin longstring
(使用垃圾收集),基础字符数组将不会被分箱,因为s
仍然引用它,你最终消耗了巨大的金额内存为2个字符的字符串。
String(String)
构造函数通过从用于构造的字符串引用的字符数组创建新的字符数组来解决此问题。当通过垃圾收集删除原始字符串时,substring()
结果将不会引用其字符数组,因此也将删除它。
请注意,这种行为最近在Java中发生了变化(我认为是版本7u4),并且字符串不再支持上述操作模式。
答案 1 :(得分:0)
你是绝对正确的Rob,在这个例子中没有必要新建一个String。只是提供对someStringBufferObj.toString()的调用就足够了!