哈希集首先检查引用相等性,如果通过,则跳过该
.equals调用。这是一个优化和工作,因为合同
equals,如果指定
a ==b然后
a.equals(b)。
我在下面附加了源代码,并突出显示了此检查。
相反,如果添加两个不相同引用的相等元素,则会获得预期的效果:
HashSet st1=new HashSet(); st1.add(new Student(89)); st1.add(new Student(89)); System.out.println("Ho size="+st1.size());结果是
$ java Test1Hello-hashpreHello-hashpreHello-equalsHo size=1
这是来自OpenJDK 7的源代码,其中指明了相等性优化(来自HashMap的基础实现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;// v-- HERE 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;}


