< prev index next >

src/java.base/share/classes/java/util/HashMap.java

Print this page

        

@@ -337,14 +337,18 @@
         int h;
         return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
     }
 
     /**
-     * Returns x's Class if it is of the form "class C implements
-     * Comparable<C>", 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<C>", 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
                 return c;
             if ((ts = c.getGenericInterfaces()) != null) {

@@ -356,11 +360,11 @@
                         as.length == 1 && as[0] == c) // type arg is c
                         return c;
                 }
             }
         }
-        return null;
+        return void.class;
     }
 
     /**
      * Returns k.compareTo(x) if x matches kc (k's screened comparable
      * class), else 0.

@@ -1852,12 +1856,11 @@
                     return p;
                 else if (pl == null)
                     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)
                     return q;
                 else

@@ -1913,12 +1916,11 @@
                         K pk = p.key;
                         if ((ph = p.hash) > h)
                             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);
 
                         TreeNode<K,V> xp = p;
                         if ((p = (dir <= 0) ? p.left : p.right) == null) {

@@ -1967,12 +1969,11 @@
                     dir = -1;
                 else if (ph < h)
                     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<K,V> q, ch;
                         searched = true;
                         if (((ch = p.left) != null &&
< prev index next >