在我的应用程序中,我使用randomaccessfile存储字符串,并且在回读字符串时,我需要将字节数组转换为字符串,这导致OOM。除此以外,还有没有更好的转换方式
str =新的String(b,“ UTF-8”);
其中b是字节数组
答案 0 :(得分:1)
除了
new String(bytes, "UTF-8")
以外,还有更好的转换方法吗?
这实际上是一个相当复杂的问题。
此构造函数不能简单地将byte[]
合并到字符串中:
在Java 9之前,始终需要将字节数组解码为char
的UTF-16编码数组。因此,构造函数很容易分配源byte[]
使用的内存大约两倍。
对于Java 9,您可以选择对String
使用新的紧凑表示形式。如果您执行AND操作,并且UTF-8编码的字节数组仅包含Unicode代码平面零(\u0000
至\u00ff
)中的代码点,则String
的值为{{1 }}。但是,即使在这种情况下,构造函数也必须将字节复制到新的byte[]
。
在两种情况下,都没有一种节省空间的方法可以从byte[]
创建String
。此外,我认为从字节流和字符计数开始的转换没有更节省空间的方式。 (我不包括修改byte[]
实现或使用反射破坏抽象的东西。)
底线:将lava.lang.*
转换为byte[]
时,如果您希望代码在较旧的JVM上运行,则应至少允许连续的空闲内存是原始String
的两倍。