1.equals如果没有重写的话是比较地址和==效果一样
2.==比较的是对象的引用地址
3.hashcode的比较是在集合中才会使用到,比如HashSet中的add方法:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key);
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;
}
从上面的源码可以看出来,如果是集合中的操作,首先判断的是hashcode是否相等,如果不相等直接将数据添加,否则还要用equals判断是否相等,如果hashcode和equals比较都是相等的,那么就将值替换。
总结:
【1】equals是判断两个对象是否对等,这个理解起来很简单,不用多说;hashCode是为对象生成一个哈希值(整数),这个值最常用的HashMap和HashSet中,而且对象是作为Key使用时才起作用。当然谁都不能保证每一个对象的hashCode都是唯一的,所以在Hash查找时,必须另外使用equals在一串hashCode相同的对象中查找真正的对应的Key。如果考虑到Hash过程即使不同的hashCode值也可能会被放到同一个链表中,这更需要equals了。
【2】元素放入集合时,不是所有集合都会检查hashCode值,只有运用了hash算法的集合,才会用到hashCode,比如HashSet,HashMap等,如果你往ArrayList里面添加元素,是不会用到hashCode的.
【3】如果一个对象equals另一个对象,那么他们的hashcode不一定相同,equals和hashcode两者之间没有必然的确定关系,这需要具体情况具体分析。