HashMap不添加重复键

use*_*842 0 java collections scjp hashmap

import java.util.*;

class U {
    int x;

    U(int x) {
        this.x = x;
    }
}

public class G {
    public U a = new U(22);
    public U b = new U(23);
    Integer y = 22;
    Integer r = 23;

    void a() {
        Map<U, Integer> set = new HashMap<U, Integer>();
        set.put(a, y);
        set.put(a, r);
        set.put(b, y);
        System.out.print(set.size() + " ");
    }

    public static void main(String[] args) {
        G m = new G();
        m.a();
    }
}
Run Code Online (Sandbox Code Playgroud)

我总是对地图和列表感到困惑.我知道当map将密钥放入集合时,它会调用hashcode,如果存储桶相同,则调用equal方法.但是,我了解到,如果类重写这两个方法,则不会存储重复的键.例如包装类:String实现自己的hashcode和equal方法.此外,如果您不这样做,则会调用唯一的哈希码,并且重复的密钥将存储在集合中.

但是在上面的例子中,类U没有实现hashcode和equal方法.但是,Map不允许重复键.

我检查了SIZE:它的2应该是3,因为我的U类没有实现hashcode也没有.

请清除我

提前致谢

Jig*_*shi 7

HashMap 不允许重复的密钥,

如果你没有从超类中提供hashcode()equals()实现它extends(对于你的情况而言java.lang.Object),并且该实现为同一个对象提供相同的哈希码并equals()在同一个对象返回true

public boolean equals(Object obj) {
    return (this == obj);
}
Run Code Online (Sandbox Code Playgroud)

同样