Guava ImmutableMap has noticeably slower access than HashMap

前端 未结 2 1687
渐次进展
渐次进展 2021-02-02 07:28

While working on a memory benchmark of some high-throughput data structures, I realized I could use an ImmutableMap with only a little refactoring.

Thinki

2条回答
  •  爱一瞬间的悲伤
    2021-02-02 07:52

    As Louis Wasserman said, ImmutableMap is not optimized for objects with slow equals method. I think the main difference is here:

    HashMap:

    if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
        return e.value;
    

    ImmtubleMap:

    if (key.equals(candidateKey)) {
        return entry.getValue();
    

    As you can see, to check for collisions, HashMap first check the hashes. This allows to reject values with different hashes fast. Since String doesn't make this check in its equals method, this makes HashMap faster. ImmutableMap doesn't use this optimization because it would make the test slower when equals is already optimized.

提交回复
热议问题