我在java中有一个大的HashMap,存储从字符串到整数的映射。它有 400K 条记录。它运行正常,但我想知道在内存使用方面是否有更好的优化。 Map初始化后,只会进行搜索,不会进行其他更新操作。
我依稀记得我遇到过一些将字符串键转换为 int 的建议,但不确定。请对此提供帮助或分享您的想法。
谢谢。
最佳答案
I vaguely remember that I came across some suggestions to convert the string keys as int, but not sure about that.
如果字符串键实际上是整数的字符串表示形式,那么使用 Integer 将它们转换为
。您将节省一些内存,因为原始包装类使用的内存比相应的 String 对象少。节省的空间可能会很大(每个 key 可能约为 16 字节,而每个 key 约为 40 字节……具体取决于您的平台。)Integer
或 Long
对象是有意义的.valueOf(字符串)
另一方面,您需要在进行 HashMap 查找之前将候选键从 String 转换为真实键类型。该转换需要一些时间,并且通常会生成一些垃圾。
但是如果String
键不代表整数,那么这根本不起作用。 (或者至少......我不知道你指的是什么“转换”......)
另请注意, key 类型必须为 Integer
/Long
而不是 int
/long
。泛型类型参数必须是引用类型。
可能有第 3 方集合实现也会有所帮助......具体取决于您的数据结构的工作原理;例如Trove、 Guava 、Fastutil。尝试将 then 与 String -> Integer 预转换 ...
关于使用数据库的建议。如果
- 您不需要数据库的查询/更新/事务功能,并且
- 您有足够的内存来保存数据,并且
- 您可以承担将数据加载到内存中的启动成本,
那么使用数据库只会对每次查找造成很大的、不必要的性能影响。
关于java - 大内存如何优化内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676811/