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