java - HashMap的性能

标签 java string hashmap

我必须处理 450 个唯一字符串大约 5 亿次。每个字符串都有唯一的整数标识符。有两个选项供我使用。

  1. 我可以将标识符附加到字符串中,并在到达时 string 我可以拆分字符串来获取标识符并使​​用它。
  2. 我可以将 450 个字符串存储在 HashMap<String, Integer> 中等等 字符串到达​​,我可以查询HashMap获取标识符。

有人可以建议哪种选项在处理方面更有效吗?

最佳答案

这一切都取决于字符串的大小等。

你可以做各种各样的事情。

您可以使用二分搜索来获取列表中的索引,该索引处就是标识符。

您可以仅对前 2 个字符进行散列,而不是对整个字符串进行散列,这可能比二分搜索更快,假设字符串具有良好的分布。

如果第一个字符或前两个字符在指向标识符的 255 或 65K 大型数组中作为“完美索引”是唯一的,则可以使用它们。

此外,如果您的标识符是数字,最好预先计算它,而不是一直动态转换它。文本 -> 二进制实际上相当昂贵(二进制 -> 文本更糟糕)。因此,如果可能的话,最好避免这种情况。

但你应该解决这个问题。 100 万个任何东西,每个 1 毫秒,就是 20 分钟的处理时间。在 500m 处,每浪费一纳秒,就会增加 8 分钟以上的处理时间。您可能不在乎,但只是证明在这些规模上“每一点都有帮助”。

所以,不要相信我们的话,测试不同的东西来找到最适合你的工作集的结果,然后就这样做。还要考虑过多的对象创建,并避免这种情况。通常情况下,我不会再考虑这个问题。对象创建速度很快,但纳秒就是纳秒。

如果您使用 Java,并且您并不真正需要 Unicode(即您正在使用 0-255 范围内的单个字符),那么我根本不会使用字符串。我会使用原始字节。字符串基于 Java 字符,即 UTF-16。 Java Readers 将 UTF-8 转换为 UTF-16。单例的。时间。 5亿次。是的!又是几纳秒。 8 纳秒会使您的处理时间增加一个小时。

所以,再一次,看看所有的角落。

或者,不要,简单地编写它,启动它,在周末运行它,然后完成它。

关于java - HashMap的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25696524/

相关文章:

python - 使用tesseract和opencv进行python字符串比较

java - 使用 long 计算素数 (Java)

java - 将两张 map 合并为第三张

java - EJB : Socket connection pooling

ios - 将字符串与数组一起传递,但使用 Alamofire 在 swift 中将字符串读取为 null

java - 对象的 ArrayList 与 HashMap 的 Arraylist

java - 在极其庞大的数据集中查找重复项

java - 在Java中重写equals和hashCode时应该考虑哪些问题?

java - 一个属性不存在后继续阅读 XML

java - 在 Recyclerview 中滚动后,以前的数据会更新