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
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.