Note that this cache is very inefficient until hashCode() is better implemented.

Something that didn't occur to me when I talked to Dwight yesterday is that even with a fast hashCode() this HashMap might be slow if HashMap uses Object.equals instead of pointer equality.  I can't find anywhere that the JavaDoc says one way or the other.