hashCode 牛角尖
hashCode有什么用?java doc里面说的很清楚了:
hashCode
方法都必须生成相同的整数结果。 (equals比较相同的对象,hashCode应该相同)equals(java.lang.Object)
方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。(这句话的意思是不同的对象,他们的hashCode可以是相同的。)对于使用hash来判断的集合来说,还是直接看源码比较清楚,以hashmap来说:
public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (
e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (
e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
看清楚了,是先比较hashcode再比较equal,当然,一旦hashcode不同,短路后那么equal就不会判断了。
这就揭开了我的牛角尖,不同类型的对象hashcode相同怎么办?
不同类型对象即使hashcode存在偶然相同的可能,equal理论上是应该不同的。在实现hashcode时,只要考虑同一类型中不同即可,不必要做到UUID的级别!
那么就别把hashcode当UUID使用了!