属性值相等的两个对象,分别放进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; } }