java - Java ArrayList<String> 的紧凑替代品

标签 java android string arraylist low-memory

<分区>

我需要存储一个大型自然语言单词词典 -- 最多 120,000 个,具体取决于语言。这些需要保存在内存中,因为分析表明使用数组的算法是系统中的时间瓶颈。 (它本质上是一种拼写检查/自动更正算法,尽管细节并不重要。)在具有 16MB 内存的 Android 设备上,与 Java 相关的内存开销 String s 导致我们空间不足。请注意,每个 String有一个38 byte overhead associated with it,这会产生高达 5MB 的开销。

乍一看,一个选项是替换 char[]对于 String . (甚至是 byte[] ,因为 UTF-8 在这种情况下更紧凑。)但是内存开销同样是一个问题:each Java array has a 32 byte overhead .

ArrayList<String> 的一种替代方法等是创建一个具有几乎相同接口(interface)的类,该类在内部将所有字符串连接成一个巨大的字符串,例如表示为单个 byte[] ,然后将偏移量存储到那个巨大的字符串中。每个偏移量将占用 4 个字节,从而提供更节省空间的解决方案。

我的问题是 a) 是否有任何其他解决方案可以以类似的低开销* 和 b) 是否有任何现成的解决方案?搜索 Guava , trovePCJ集合库不产生任何结果。

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

注意。 Support for Compressed Strings being Dropped in HotSpot JVM?建议 JVM 选项 -XX:+UseCompressedStrings在这里没有帮助。

最佳答案

我必须为一个类(class)项目开发一个单词词典。我们最终使用了 trie 作为数据结构。不确定 arrraylist 和 trie 之间的大小差异,但性能要好得多。

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

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

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

关于java - Java ArrayList<String> 的紧凑替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31122128/

相关文章:

java - 在 eclipse 中执行但不在 Unix 中运行的 Jar

android - 在偏好更改监听器的基础上更改 android View 模型的查询参数

android - 上下文菜单安卓

java - 计算以相同子串开头和结尾的最大子串的长度

c - 将大数字作为字符串进行操作

Java Weka获取具有给定属性值的所有实例

Java无限新对象

java - TreeMap put 未按预期工作

android - 将Firebase与Kotlin协同程序一起使用:取消作业时不会取消任务

c - 按字典顺序排列的字符串的非重复排列