Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap-没有为相等的键返回正确的值_Java_Hashmap - Fatal编程技术网

Java HashMap-没有为相等的键返回正确的值

Java HashMap-没有为相等的键返回正确的值,java,hashmap,Java,Hashmap,我正在玩Java中的HashMaps,我偶然发现了一些我无法理解的东西。我在这里似乎也找不到我的问题的副本 我正在尝试创建一个具有VertexPair键和整数值的贴图。VertexPair只是2个Vertex对象的容器。当我创建2个具有相同哈希代码且相等(由.equals()验证)的VertexPairs时,它们不会从映射返回相同的值 这是我的密码: HashMap<VertexPair, Integer> edges = new HashMap<VertexPair, Int

我正在玩Java中的HashMaps,我偶然发现了一些我无法理解的东西。我在这里似乎也找不到我的问题的副本

我正在尝试创建一个具有
VertexPair
键和
整数
值的贴图。
VertexPair
只是2个
Vertex
对象的容器。当我创建2个具有相同哈希代码且相等(由.equals()验证)的
VertexPairs
时,它们不会从映射返回相同的值

这是我的密码:

HashMap<VertexPair, Integer> edges = new HashMap<VertexPair, Integer>();

Vertex a = new Vertex("A");
Vertex b = new Vertex("B");

VertexPair p = new VertexPair(a, b);
VertexPair m = new VertexPair(a, b);
VertexPair n = new VertexPair(b, a);
VertexPair check = new VertexPair(a, new Vertex("C"));

System.out.println(p.equals(m));
System.out.println(p.equals(n));
System.out.println(m.equals(n));
//just to be sure equals is working
System.out.println(p.equals(check));

System.out.println(m.hashCode());
System.out.println(n.hashCode());
System.out.println(p.hashCode());
//just to be sure hashCode is working
System.out.println(check.hashCode());

edges.put(p, 10);

System.out.println(edges.get(p));
System.out.println(edges.get(m));
System.out.println(edges.get(n));
以下是要求的VertexPair类:

public final class VertexPair {

    private HashSet<Vertex> set;

    public VertexPair(Vertex a, Vertex b) {
        if(a==null || b==null)
            throw new NullPointerException("Vertexes must not be null");
        set = new HashSet<Vertex>();
        set.add(a);
        set.add(b);
    }

    public HashSet<Vertex> getVertexes() {
        return set;
    }       

    @Override
    public int hashCode() {
        return set.hashCode();
    }

    public boolean equals(VertexPair p) {
        if(!(p instanceof VertexPair))
            return false;
        if(p==this)
            return true;
        return set.equals(p.getVertexes());

    }


}
公共最终类VertexPair{
私有哈希集;
公共顶点EXPAIR(顶点a、顶点b){
如果(a==null | | b==null)
抛出新的NullPointerException(“顶点不能为null”);
set=新的HashSet();
增加(a);
增加(b);
}
公共HashSet getvertexs(){
返回集;
}       
@凌驾
公共int hashCode(){
返回set.hashCode();
}
公共布尔等于(vertexpp){
如果(!(VertexPair的p实例))
返回false;
如果(p==这个)
返回true;
返回set.equals(p.getVertexs());
}
}
有人能给我解释一下发生了什么事吗?我一定是误解了HashMaps的一些关键内容。提前感谢:)

更换

public boolean equals(VertexPair p) {

public boolean equals(VertexPair p) {
@Override
public boolean equals(Object p) {