Java的UTF-8字符串类

7

我需要在内存中保存大量字符串对象(数百MB),希望以UTF-8格式保存,因为在大多数情况下,与默认实现相比,占用的内存只需一半。

默认的String类对于一个12个字符的字符串需要60个字节(参见http://blog.griddynamics.com/2010/01/java-tricks-reducing-memory-consumption.html)。

我的大部分字符串长度为10-20个字符。

我想知道是否有一些开源库提供了这样的字符串包装器?

我知道如何将字符串转换为UTF-8字节数组,但我正在寻找一个包装器类,它将提供所有需要的实用函数(哈希、等号、toString、fromString等)。


2
http://docs.oracle.com/javase/tutorial/i18n/text/string.html - tckmn
2
Java将所有字符串内部存储为UTF-16,因此您的12个字符字符串在内部占用24个字节。不计算强制对象开销,那么60个字节的数字从哪里来? - fge
最小为24个字节,因为UTF编码是可变长度的(尽管在OP的示例中必须使用一些非常奇特的字符才能超过24个字节)。 - Anders R. Bystrup
3
在一些Sun JVM版本中有一个名为UseCompressedStrings的JVM选项,但我相信它在Java 7中被删除了。如果你使用的是早期版本,它可能仍然可用。 - McDowell
你的内存节省能力将取决于数据的静态程度。60字节的数字来自于由于操作字符串而产生的开销,以及由于无法清理而产生的浪费。String类被优化为实现高效的“子字符串”操作。这种浪费是想要这些方法所固有的。你可以通过仔细限制对所需新字符串类的操作来节省这些开销。但你需要明确自己的需求。 - AgilePro
显示剩余4条评论
2个回答

2

Apache Avro有一个UTF8包装类,实现了CharSequence接口,但我不知道这种对象的内存消耗。

Hadoop有Text类,它具有您需要的接口类型。


你是不是想让这两个链接一样? - AgilePro

0
如果您想要每个字符串都有一个独特的对象,并且希望它们尽可能紧凑,则使用字节数组。这将是每个字符1个字节而不是2个字节,并且您不会有String头的开销(每个对象大约增加32个字节)。
但是,当然,您将无法在这些上使用任何String方法,除非首先转换为String。
但是,如果您真的想要节省空间,请将字符串依次存储在几个较大的数组中,并使用“dope vectors”来定位各个字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接