屬性值相等的兩個對象,分別放進List和Set
java
Set集合:this
兩個對象的equals和hashcode都相等,才認爲是同一個對象;spa
若是equals爲false,則無論hashcode什麼結果,Set size爲2;.net
若是equals爲true,只有當hashcode也相等,size才爲1code
因此要使得兩個對象相等,必須同時重寫equals和hashcode。對象
http://blog.csdn.net/afgasdg/article/details/6889383blog
總結:hash
一、equals方法用於比較對象的內容是否相等(覆蓋之後)table
二、hashcode方法只有在集合中用到class
三、當覆蓋了equals方法時,比較對象是否相等將經過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。
四、將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,若是不相等直接將該對象放入集合中。若是hashcode值相等,而後再經過equals方法判斷要放入對象與集合中的任意一個對象是否相等,若是equals判斷不相等,直接將該元素放入到集合中,不然不放入。
五、將元素放入集合的流程圖:
六、HashSet中add方法源代碼:
public boolean add(E e) { return map.put(e, PRESENT)==null; }
map.put源代碼:
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; } }