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

问题描述

创建这样的字符串时:

String s1 = “ABC”

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

所以使用

String s1 = new String("ABC")

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

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

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

这将始终创建一个新对象。我可以在不每次都创建新对象的情况下将 char 数组转换为 String 吗?

解决方法

我知道没有办法避免在您的 String 中创建 toString() 对象,但是您可以通过显式调用 String.intern()

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

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

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

,

如果您的目标是减少内存使用,您还可以考虑您通常存储在 char[] names 中的内容,以及您如何在示例中未显示的其他代码中操作该成员字段。从 char[] 切换到 String 可能会减少内存。

Java 9 引入了紧凑字符串,与需要 UTF16 的字符串相比,它减少了拉丁语 String 的内部存储空间。因此,在某些情况下,new String(this.names) 使用比 char[] names 更少的内存,因为它存储相同字符的 byte[] 表示 - 尽管这会导致 String 的额外对象的开销。但是,对于访问 names 的其他操作,String 可能不适合表示,尤其是在您需要调用 toCharArray() 以恢复原始格式以使应用程序像以前一样工作时。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...