Java的紧凑替代方法ArrayList <String>

我需要存储一个大的自然语言词典 – 高达12万,取决于语言。 这些需要保存在内存中,因为分析表明使用arrays的algorithm是系统中的时间瓶颈。 (这本质上是一个拼写检查/自动更正algorithm,虽然细节并不重要。)在具有16MB内存的Android设备上,与Java String相关的内存开销正在导致我们的空间不足。 请注意,每个String都有一个38字节的开销与它相关联,这会产生高达5MB的开销。

乍一看,一种select是用char[]replaceString 。 (甚至是byte[] ,因为在这种情况下UTF-8更紧凑)。但是,内存开销也是一个问题: 每个Java数组都有32字节开销 。

ArrayList<String>等的一个替代方法是创build一个具有相同接口的类,以便在内部将所有string连接成一个巨大的string,例如表示为单个byte[] ,然后将偏移量存储到该巨大的string中。 每个偏移将占用4个字节,从而提供了更多的节省空间的解决scheme。

我的问题是a)有没有其他的解决scheme,以类似的低开销*和b)的问题是任何现成的解决scheme? 通过番石榴 , trove和PCJ收集图书馆search没有收益。

*我知道可以将开销降到4字节以下,但收益递减。

NB。 支持压缩string在HotSpot JVM中被丢弃? build议JVM选项-XX:+UseCompressedStrings在这里-XX:+UseCompressedStrings

我不得不为一个类项目开发一个字典。 我们最终使用了一个trie作为数据结构。 不知道arrylist和trie之间的大小差异,但是性能要好很多。

这里有一些可能有用的资源。

https://en.wikipedia.org/wiki/Trie

https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/