Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap的性能_Java_String_Hashmap - Fatal编程技术网

Java HashMap的性能

Java HashMap的性能,java,string,hashmap,Java,String,Hashmap,我必须处理450个独特的字符串,大约5亿次。每个字符串都有唯一的整数标识符。我有两个选择 我可以将标识符附加到字符串中,并在 字符串我可以拆分字符串以获取标识符并使用它 我可以将450个字符串存储在HashMap和 当字符串到达时,我可以查询HashMap以获取标识符 有人能建议哪个选项在处理方面更有效吗?如果代码写得足够好,拆分字符串的速度应该会更快。事实上,如果您已经拥有int-id,那么我认为没有理由只发送字符串并维护映射 每次放入HashMap都需要对传入字符串进行哈希运算。因此,您基本

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

  • 我可以将标识符附加到字符串中,并在 字符串我可以拆分字符串以获取标识符并使用它
  • 我可以将450个字符串存储在
    HashMap
    和 当字符串到达时,我可以查询
    HashMap
    以获取标识符

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

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

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


    OTOH,只有450个字符串不是什么大问题,如果你喜欢的话,编写自己的哈希算法/函数实际上是最优雅和性能最好的。

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

    你可以做各种各样的事情

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

    您可以只对前2个字符进行散列,而不是对整个字符串进行散列,这可能比二进制搜索要快,假设字符串具有OK分布

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

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

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

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

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

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


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

    如果每个字符串都有一个唯一的标识符,那么只有在hashmaps的情况下,检索才是O(1)

    我不建议使用第一种方法,因为您将每个字符串拆分为450*500米,除非您的订单是一个字符串500米次,然后继续下一个。正如Will所说,将数字附加到字符串然后检索可能看起来很简单,但不建议这样做


    因此,如果您的数据是静态的(仅450个字符串),请将它们放在Hashmap中并进行实验。祝你好运。

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

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

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


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

    您的问题不清楚。请进一步澄清每个选项的含义。标识符来自哪里?你说的“处理”它们5亿次是什么意思?标识符是否来自密集集(即连续整数,例如1-450)?如果不是,分布情况如何。这里缺少很多信息,这些信息在决定使用哪种数据结构时非常重要。您不能创建一个包含两个字段的类,
    theString
    theIdentifier
    ?您使用哪种方法可能并不重要。“获取”字符串和/或在查找后处理它们的开销可能大大超过字符串“标识”过程的开销。(如果不是……您需要解释更大的上下文。)假设有450个唯一的字符串,每个字符串都有一个唯一的int标识符。现在有一个长度为450*5000000000的字符串向量。此向量中的每个条目都是450个字符串中的一个。我必须处理这个向量。我希望现在很清楚,您似乎有一个“现实世界的问题”——您的实际任务是处理5亿个字符串。在Java中,很难进行性能的微基准测试,因为动态热点JVM对于相同的代码可能具有不同的性能,这取决于您如何使用它。但是在这里,我的建议是:用两种方法实现它并测试它。这两个选项都很简单,只需很少的时间即可实现,而且您将有非常好的性能数据进行分析。如果没有工具,只需使用智能手机上的秒表即可。拆分字符串将创建两个新字符串,然后必须对它们进行GCD。引用哈希映射会便宜得多。@HotLicks,请阅读。“如果你的代码写得足够好”,“你已经有了int-id”,“编写你自己的哈希算法/函数”