--- old/src/java.base/share/classes/java/util/HashMap.java 2015-01-14 16:29:19.393187548 +0100 +++ new/src/java.base/share/classes/java/util/HashMap.java 2015-01-14 16:29:19.275189702 +0100 @@ -339,10 +339,14 @@ } /** - * Returns x's Class if it is of the form "class C implements - * Comparable", else null. - */ - static Class comparableClassFor(Object x) { + * Returns 'cached' if != null, else + * returns x's Class if it is of the form "class C implements + * Comparable", else void.class. + */ + static Class comparableClassFor(Class cached, Object x) { + if (cached != null) { + return cached; + } if (x instanceof Comparable) { Class c; Type[] ts, as; ParameterizedType p; if ((c = x.getClass()) == String.class) // bypass checks @@ -358,7 +362,7 @@ } } } - return null; + return void.class; } /** @@ -1854,8 +1858,7 @@ p = pr; else if (pr == null) p = pl; - else if ((kc != null || - (kc = comparableClassFor(k)) != null) && + else if ((kc = comparableClassFor(kc, k)) != void.class && (dir = compareComparables(kc, k, pk)) != 0) p = (dir < 0) ? pl : pr; else if ((q = pr.find(h, k, kc)) != null) @@ -1915,8 +1918,7 @@ dir = -1; else if (ph < h) dir = 1; - else if ((kc == null && - (kc = comparableClassFor(k)) == null) || + else if ((kc = comparableClassFor(kc, k)) == void.class || (dir = compareComparables(kc, k, pk)) == 0) dir = tieBreakOrder(k, pk); @@ -1969,8 +1971,7 @@ dir = 1; else if ((pk = p.key) == k || (k != null && k.equals(pk))) return p; - else if ((kc == null && - (kc = comparableClassFor(k)) == null) || + else if ((kc = comparableClassFor(kc, k)) == void.class || (dir = compareComparables(kc, k, pk)) == 0) { if (!searched) { TreeNode q, ch;