Java char数组到String而不创建新对象

标签 java jvm string-pool

当像这样创建一个字符串时:

String s1 = “ABC”

如果“ABC”存在,JVM 将在字符串池中查找,只有当“ABC”不存在时才创建一个新对象。

所以用法

String s1 = new String("ABC")

停止此行为并每次都会创建一个对象。

现在我在将 char 数组转换为 String 时遇到问题:

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

这将始终创建一个新对象。我可以从 char 数组转换为 String 而无需每次都创建一个新对象吗?

最佳答案

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

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

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

但在这样做之前,请帮自己一个忙 be aware of what you're doing .生成字符串对象可能是更好的选择,具体取决于您这样做的主要原因。

关于Java char数组到String而不创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68223952/

相关文章:

java - Java 字符串上 + 和 += 的区别

java - AppEngine 持久对象延迟?

java - Thread.join 卡住进度条

java - 用静态 block 覆盖静态字段是不好的做法吗?

java - MethodHandle - 这是什么?

Java SE 字符串池

java - 与 concat 一起使用时,字符串池的行为会有所不同吗?

java - 在关机时停止所有 Spring 批处理作业 (CTRL-C)

JAVA POI内存不足问题

java - 在 tomcat 中设置 JVM 内存选项?