Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于java的UTF-8字符串类_Java_String_Performance_Memory - Fatal编程技术网

用于java的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

我需要在内存中保存大量字符串对象(数百MB),并且我希望以UTF-8格式保存它们,因为在大多数情况下,它需要默认实现使用的一半内存。
默认字符串类需要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。如果您使用的是早期版本,它可能可用。您的意思是使两个链接相同吗?