用于java的UTF-8字符串类
我需要在内存中保存大量字符串对象(数百MB),并且我希望以UTF-8格式保存它们,因为在大多数情况下,它需要默认实现使用的一半内存。用于java的UTF-8字符串类,java,string,performance,memory,Java,String,Performance,Memory,我需要在内存中保存大量字符串对象(数百MB),并且我希望以UTF-8格式保存它们,因为在大多数情况下,它需要默认实现使用的一半内存。 默认字符串类需要12个字符的字符串60个字节(请参阅)。 我的大多数字符串长度为10-20个字符。 我想知道是否有一些开源库为这些字符串提供了包装器? 我知道如何将字符串转换为UTF-8字节数组,但我正在寻找一个包装类,它将提供所有需要的实用程序函数(Hash、Equal、toString、fromString等)。ApacheAvro有一个实现CharSeque
默认字符串类需要12个字符的字符串60个字节(请参阅)。
我的大多数字符串长度为10-20个字符。
我想知道是否有一些开源库为这些字符串提供了包装器?
我知道如何将字符串转换为UTF-8字节数组,但我正在寻找一个包装类,它将提供所有需要的实用程序函数(Hash、Equal、toString、fromString等)。ApacheAvro有一个实现
CharSequence
,但我不知道这类对象的内存消耗
Hadoop具有的接口与您所希望的接口完全相同如果您希望每个字符串都有一个不同的对象,并且希望它们尽可能紧凑,那么请使用字节数组。这将是每个字符1个字节,而不是2个字节,并且不会有字符串头的开销(每个对象可能增加32个字节) 当然,如果不先转换为字符串,就不能在这些方法上使用任何字符串方法
但是,如果您真的想节省空间,可以将字符串背靠背存储在几个较大的数组中,使用“dope Vector”来定位单个字符串。Java将所有字符串内部存储在UTF-16中,因此12个字符的字符串内部为24个字节。不算强制性的对象开销,60字节的数字从何而来?…最小24字节,因为UTF编码是可变长度的(当然,在OP的示例中,您必须使用一些严重的外来字符来超过24字节)定义“批次”。你说的是兆字节还是千兆字节?你的弦有多大?除非你说的是千兆字节的长字符串,否则你不会发现你所期望的节省(我已经去过了)。根据您的应用程序,规范化可能是更好的选择。在一些Sun JVM版本中有
UseCompressedStrings
JVM选项,但我相信Java 7。如果您使用的是早期版本,它可能可用。您的意思是使两个链接相同吗?