Huh? How so? It's actually basically the same algorithm a full-on hash
table would use. Specifically: hash value gets you to a very small
subset of the possible values (very often just one, as long as the hash
code algorithm is good), then linear search on collisions.
Before case strings, there were two JVM instructions for implementing
an int switch, tableswitch and lookupswitch. The efficient tableswitch
is a jump table used when the switch values are reasonably dense e.g.
numbered 0..N. The less efficient lookupswitch is a binary search or
linear search used when the switch values all over the map.
I understood the way string case labels worked posted earlier was to
use the hashCode as the switch variable, which would necessitate the
use of the inefficient lookupswitch plus a little kludge to deal with
hashCode collisions.
In contrast a String case lookup done manually with HashMap does not
involve any binary search or linear scan. It folds the hashCode to a
reasonable value and does a table lookup.
As usual, there is nothing in the JVM spec that says how lookupswitch
has to be implemented. For maximum speed (but extravagant RAM), the
JIT could analyse the values, and construct a perfect or near perfect
hash table. It has the advantage the values are known at load time and
cannot change. I have seen reference to a number of C algorithms for
doing this. The JIT has to generate thread-safe code. HashMap does
not.
--
Roedy Green Canadian Mind Products
http://mindprod.com
The modern conservative is engaged in one of man's oldest exercises in moral philosophy; that is,
the search for a superior moral justification for selfishness.
~ John Kenneth Galbraith (born: 1908-10-15 died: 2006-04-29 at age: 97)