记得在刚上初一的时候,第一堂数学课学的是集合,那时候我知道了集合是不允许重复元素存在的。
hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。
为什么重写了 equals 方法,还要重写 hashCode 方法? 
因为如果只重写了 equals 方法,两个对象 equals 返回了true,但是如果没有重写 hashCode 方法,集合还是会插入元素。这样集合中就出现了重复元素了。
接下来详细分析,以 HashMap 的 put 方法:
    public V put(K key, V value) {    
        if (key == null)    
            return putForNullKey(value);    
        //通过key的hashcode计算hash值
        int hash = hash(key.hashCode());    
        //通过hash值和table数组的长度计算出元素存放在table数组的位置
        int i = indexFor(hash, table.length);    
        //table[i]的位置已经存在元素,遍历链表
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {    
            Object k;    
            //调用 equals 方法判断key是否相等,若相等,该key对应的键值对已经存在,用新的value取代旧的value
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {    
                V oldValue = e.value;    
                e.value = value;    
                e.recordAccess(this);    
                return oldValue;    
            }    
        }    
        modCount++;  
        // 若该key对应的键值对不存在,将key-value封装成Entry对象添加到table[i]处 ,头插法。 
        addEntry(hash, key, value, i);    
        return null;    
    }    往HashMap添加元素的时候,需要先定位到在数组的位置(hashCode方法)。
如果只重写了 equals 方法,两个对象 equals 返回了true,集合是不允许出现重复元素的,只能插入一个。
为什么重写了equals(),还要重写hashCode()?
原文:http://blog.csdn.net/xyh269/article/details/69171545