【问题标题】:Can I store 50 mb of string type key value pair data in Java Hash Map我可以在 Java Hash Map 中存储 50 mb 的字符串类型键值对数据吗
【发布时间】:2018-03-09 16:42:27
【问题描述】:

我想在 Java 哈希图中存储大约 500 万个唯一字符串。键和值将是相同的字符串。字符串最大长度为 15 个字符(ASCII)。稍后我想查找哈希映射中是否存在特定字符串。

我是否需要担心上述场景的内存大小问题。我猜它不需要超过 75 mb 到 150 mb 的内存。

提前致谢。

【问题讨论】:

标签: java string hashmap size


【解决方案1】:

键和值将是相同的字符串。

在其键和值相同时使用Map 是多余的。您应该改用Set,尤其是如果您只打算使用contains

关于您对空间的关注,我们假设每个 String 的长度为 15 个字符。

假设您使用的是 Java 9,拉丁语 1 字符只需要一个 byte,因此 500 万个唯一的 Strings 最多需要 75_000_000 字节或 75 MB

Java 8 及以下版本使用char[] 支持它们的Strings,因此在这种情况下您基本上需要两倍的内存。

【讨论】:

  • 嗨 Jacob G.,可以使用套装吗?我需要担心 75 mb 的大小还是完全没问题。我想我有 java 8。我是 java 新手,不太了解这些版本的效果。
  • 明智的做法是使用Set,因为它由Map 支持,但它的值未被使用(内存比复制String 少)。 75 MB 应该很好,只要您能够分配足够的堆空间(我假设您可以这样做)。对于 Java 8,您最多需要 150 MB(加上一些开销)来单独使用 Set
  • @JacobG。你说得对,你应该使用Set,但不是因为你说的原因。如果您将相同的实例设置为键和值,则大小不会增加一倍,因为仅设置了引用并且该大小与例如的长度无关。 String 在它后面。您应该使用Set,因为它向代码的读者展示了您在做什么,否则您可能会感到困惑,为什么还要将键设置为值。
  • JLS:“String 类的实例表示 Unicode 代码点的序列。”如果您的字符串包含拉丁语 1 可以表示的字符之外的字符,那么它们将在 Java 9 中占用每个字符两个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2020-03-11
  • 2017-08-29
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
相关资源
最近更新 更多