Java中HashMap是使用拉链法来解决冲突的,请教是为什么

Java中HashMap是使用拉链法来解决冲突的,请问是为什么?
当向HashMap存入相同Key,不同Value的时候,旧值被覆盖。那何必用拉链法把相同Key的Value存入链表呢?百思不得骑姐啊- -!请问是为什么呢
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

不用的key,可能会有相同的hashcode

的key,可能会有相同的hashcode


是的,但是直接覆盖原值就行了,即替换头结点即可,但是现在为什么要加入链表中呢,旧值已经用不到了,何必留着呢,没想明白啊。

比如 key1 - value 1 , key2 - value2 , key3 - value3存入HashMap之后,由于key1,key2,key3通过映射之后的hashCode都相同,则存储的时候使把value1,value2,value3构成一个链表,保存着相应的桶中。

既然是覆盖旧值,那何必保存value1,value2呢?直接就保存一个value3不就行了吗?

key1 key2 key3的hashCode相同,又不能保证key1 key2 key3相同,更不能保证value1 value2 value3相同,当然不能覆盖了
------解决方案--------------------
一句话概括:存在一种情况即两个不同对象的hashcode相同,即所谓的hash冲突,链表就是用来解决hash冲突的。

附上hashmap的源码


 final Entry<K,V> getEntry(Object key) {
        int hash = (key == null) ? 0 : hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash &&
                ((k = e.key) == key 
------解决方案--------------------
 (key != null && key.equals(k))))
                return e;
        }
        return null;
    }