当2个对象具有相同的哈希码时,不明白hashmap会发生什么

时间:2014-02-02 20:30:02

标签: java hashcode

public class random {

    public static class A{
        int id= 1;
        public int hashCode(){          
            return id;
        }
    }
    public static void main(String[] args) {
        Map<Integer, Integer> map= new HashMap<Integer, Integer>();
        A a = new A();
        A b = new A();
        map.put(a.id, 1);       
        map.put(b.id, 2);   

        System.out.println(map.get(a.id));
        System.out.println(map.get(b.id));
        System.out.println(map.size());
    }

}

输出

2
2
1

a和b具有相同的哈希码(桶),并且在该桶内是(1和2)。它表示只存在一个节点,其中b为2,当2个哈希码相同时,它们是否覆盖当前值?我读的并非如此。

来自教程

*"Since hashcode is same, bucket location would be same and collision will occur in HashMap, Since HashMap use LinkedList to store object, this entry (object of Map.Entry comprise key and value )  will be stored in LinkedList. 

Read more: http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html#ixzz2sCM7fNED*

这是否意味着我的地图现在有1个桶有2个值?我如何获取(1)

的值

4 个答案:

答案 0 :(得分:2)

来自java(http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

的hashmap文档
HashMap.put()
  

将指定的值与此映射中的指定键相关联。如果   地图以前包含键的映射,旧值是   替换。

因此新值将替换旧值。

答案 1 :(得分:2)

您使用整数ID作为Map中的密钥,而不是ab。所以hashcode()的{​​{1}}根本就没用过。

要从地图中获取值,请使用get方法。

如果您想使用a1或a2作为键,则需要声明地图:

A

答案 2 :(得分:1)

它们都具有相同的id“1”,所以当你在id的键下将它们添加到地图时,它们都会被加上键1.所以第二个会覆盖第一个。

答案 3 :(得分:1)

你弄得一团糟。

Map在键和值之间进行映射。在您的示例中,您将整数映射到整数。首先你要尝试将1映射到1,然后是1到2.映射只能映射一次键 - 如果你第二次映射键,它会覆盖第一个映射。

当两个不同的键具有相同的哈希值时,会发生哈希冲突。如果您创建了Map<A, Integer>并将A和B映射到某些值,则会发生碰撞,但会得到包含两个元素的地图。