我正在寻找一种在Java中从
我已经成功地通过迭代
然而,在没有创建
步骤如下:
有什么解决这个问题的想法吗?
非常感谢。
byte[]
反序列化String
且产生的垃圾最少的方法。由于我正在创建自己的序列化器和反序列化器,因此我完全可以在服务器端(即在序列化数据时)和客户端(即在反序列化数据时)实现任何解决方案。我已经成功地通过迭代
String
的字符(String.charAt(i)
)并将每个char
(16位值)转换为2个8位值来高效地序列化String
而不会产生任何垃圾开销。关于这个问题有一个很好的辩论here。另一种选择是使用反射直接访问String
的底层char[]
,但这超出了问题的范围。然而,在没有创建
char[]
两次的情况下,似乎不可能对byte[]
进行反序列化,这似乎有点奇怪。步骤如下:
- 创建
char[]
- 遍历
byte[]
并填充char[]
- 使用
String(char[])
构造函数创建字符串
由于 Java 的 String
不可变规则,使用构造函数会复制 char[],从而导致 2 倍的 GC 开销。我可以使用机制来规避这个问题(Unsafe String
分配 + 反射设置 char[]
实例),但我只是想问一下,除了违反 String
不可变性的约定之外,还有什么后果吗?
char[]
将非常短暂,G1会立即摆脱它”,如果char[]
小于G1区域大小的1/2,这是有道理的。如果它更大,则char[]
将直接分配为巨型对象(即自动传播到G1区域之外)。这些对象在G1中极难有效地进行垃圾回收。这就是为什么每个分配都很重要的原因。有什么解决这个问题的想法吗?
非常感谢。
MutableString
,并在其上实现许多传统上会产生大量垃圾的操作(例如快速路径的String
分割),然后有一个方法toString(from, to)
,它创建了一个类型为String
的“视图”实例。我可以这样做。但这将需要完全重构我们的应用程序,并尽可能地使用MutableString
。这是一个好主意,但我想先探索其他选择。 - SergioTCGCharBuffer
和StringBuilder
,它们都是可变的String
类型(除非你创建了一个不可变的视图),它们都有创建轻量级子序列的方法,并且它们都实现了CharSequence
,这个接口上的正则表达式包实际上实现了split
操作。虽然在查看源代码时,转换String
、CharBuffer
和StringBuilder
之间似乎会一直复制字符内容,但 HotSpot 对它们进行了特殊优化... - Holger