繁体   English   中英

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

[英]Java char array to String without creating new objects

创建这样的字符串时:

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对象,但是您可以通过显式调用String.intern()来避免保留这些新字符串(除了第一个字符串在方法执行后都符合 GC 条件String.intern()

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

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

但在此之前,请帮自己一个忙,并注意自己在做什么 生成字符串对象可能是更好的选择,这取决于您这样做的主要原因。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM