其实,你可以看一下JAVA里面关于HashSet的源代码,就能够理解里面的原理了:
hs.add(new Person("a1",11)); 在HashSet的源代码里是这样的:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
其中map是HashSet内部的一个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;
}
其中就有int hash = hash(key.hashCode());和if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
里面明确调用了Person里的hashCode和equals的方法。
所以hs.add(new Person("a1",11));打印第一句a1....hashCode
下面int x=hs.hashCode( ); 在HashSet的源代码里是这样的:
public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode();
}
return h;
}
里面(h += obj.hashCode();)迭代调用了元素中的hashCode方法。
所以出现了第二句的a1....hashCode
同理hs.add(new Person("a2", 11));打印出a2....hashCode
hs.add(new Person("a3",13));打印出a3....hashCode
int x1=hs.hashCode( );迭代打印出a1....hashCode
a3....hashCode
a2....hashCode
因为hashCode的排列是按哈希的顺序,所以打印次序是这样的
hs.add(new Person("a2",11));打印出a2....hashCode
上文已经提到int hash = hash(key.hashCode());和if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
里面明确调用了Person里的hashCode和equals的方法。
所以也打印出a2...equals..a2
hs.add(new Person("a4",14));打印出a4....hashCode
因为public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
是有返回值的,所以打印出true
|