有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

HashMap的java性能

我必须处理450个独特的字符串,大约5亿次。每个字符串都有唯一的整数标识符。我有两个选择

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

有人能建议哪个选项在处理方面更有效吗


共 (4) 个答案

  1. # 1 楼答案

    这完全取决于琴弦的大小等等

    你可以做各种各样的事情

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

    可以只对前2个字符进行散列,而不是对整个字符串进行散列,这可能比二进制搜索更快,前提是字符串的分布为OK

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

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

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

    所以,不要相信我们的话,测试不同的东西,找出什么能给你的工作带来最好的结果,然后继续。还考虑过多的对象创建,并避免这种情况。通常,我不会再三考虑。对象创建速度很快,但一纳秒就是一纳秒

    如果您使用的是Java,并且您实际上不需要Unicode(即,您使用的是0-255范围的单个字符),那么我根本不会使用字符串。我会处理原始字节。字符串基于Java字符,即UTF-16。Java阅读器每年将UTF-8转换为UTF-16。仅有一个的时间5亿次。是的!再过几纳秒。8纳秒为你增加了一小时的处理时间

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

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

  2. # 2 楼答案

    使用HashMap<Integer, String>.拆分字符串以获取标识符是一项昂贵的操作,因为它需要创建新字符串

  3. # 3 楼答案

    如果代码写得足够好,拆分字符串的速度应该会更快。事实上,如果你已经有了int-id,我认为没有理由只发送字符串并维护映射

    每次放入HashMap都需要对传入字符串进行哈希运算。因此,您基本上是在比较散列函数的性能与您编写的代码,以便在发送端追加(预结束可能有点棘手),并在接收端解析

    OTOH,只有450个字符串不是什么大问题,如果你喜欢它,编写自己的哈希算法/函数实际上是最优雅、最高效的

  4. # 4 楼答案

    我认为没有人能给你一个令人信服的“正确”答案,尤其是因为你没有提供计算的所有背景/属性。(例如,字符串的平均长度可能会产生很大的差异。)

    所以我认为你最好的选择是写一个基准。。。使用将要处理的实际字符串

    我还想寻找一种方法来提取和测试“唯一整数标识符”,它不需要拆分字符串