Java字符数组转字符串,不创建新的对象

3
创建字符串时,可以像这样:
String s1 = “ABC”

JVM将查找字符串池中是否存在“ABC”,仅当“ABC”不存在时才创建新对象。

因此,使用

String s1 = new String("ABC")

使用halt()方法可以终止该行为并每次创建一个对象。

现在当我将char数组转换为字符串时,遇到了问题:

private char[] names;
...
@Override
public String toString() {
  return new String(this.names);
}

这将始终创建一个新的对象。我能否在不每次创建一个新对象的情况下从字符数组转换为字符串?


你的目标是什么?减少内存使用,还是避免创建字符串/垃圾? - ernest_k
目标是减少内存使用。 - Sadık
如果内存是一个真正的问题(例如,如果这些是长期存在的字符串),那么请考虑打开-XX:+UseStringDeduplication(如果我没记错的话,这需要使用G1GC)。 - Mark Rotteveel
1
这取决于您在类中为什么要使用char[]数组,而不是可重复使用的String引用。 - Holger
1个回答

2

我不知道有什么方法可以避免在toString()中创建一个String对象,但是你可以通过显式调用String.intern()来避免保留这些新字符串(除了第一个字符串之外的所有字符串在方法执行后都可以进行GC):

@Override
public String toString() {
    return new String(this.names).intern();
}

您可以通过反复检查myObject.toString() == myObject.toString()来测试它。

但在此之前,请先了解您正在做什么。根据您进行此操作的主要原因,生成字符串对象可能是更好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接