问题描述
创建这样的字符串时:
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()
以恢复原始格式以使应用程序像以前一样工作时。