繁体   English   中英

Java - 从HashMap中检索对象

[英]Java - Retrieving objects from HashMap

从hashmap中检索值时出现问题。 hashmap声明如下:

HashMap<TRpair,A> aTable = new HashMap<TRpair,A>();

然后我将112个值放入地图中,如下所示:

aTable.put(new TRpair(new T(<value>),new Integer(<value>)),new Ai());

其中Ai是扩展A的4个子类中的任何一个。

然后我继续检查地图中的值,如下所示:

int i = 0;
for (Map.Entry<TRpair,A> entry : aTable.entrySet()) {
    System.out.println(entry.getKey().toString() + " " + entry.getValue().toString());
    System.out.println(entry.getKey().equals(new TRpair(new T("!"),new Integer(10))));
    i++;
}

正如人们所预料的那样,我在结尾处保持值112,并且正如预期的那样,对于一个条目,相等性测试打印为真。

但是,当我这样做的时候

System.out.println(aTable.get(new TRpair(new T("!"), new Integer(10))));

尽管上面的代码片段确认地图中确实存在一个恰好具有此键的条目,但仍输出null。

如果有帮助,则TRpair类声明如下:

public class TRpair {
    private final T t;
    private final Integer r;

    protected TRpair(Integer r1, T t1) {
        terminal = t1;
        row = r1;
    }

    protected TRpair(T t1, Integer r1) {
        t = t1;
        r = r1;
    }

    @Override
    public boolean equals(Object o) {
        TRpair p = (TRpair)o;
        return (p.t.equals(t)) && (p.r.equals(r));
    }

    @Override
    public String toString() {
        StringBuilder sbldr = new StringBuilder();
        sbldr.append("(");
        sbldr.append(t.toString());
        sbldr.append(",");
        sbldr.append(r.toString());
        sbldr.append(")");
        return sbldr.toString();
    }
}

Ai(扩展A)和T类中的equals()和toString()方法被类似地重写并且看起来表现得如预期的那样。

为什么从hashmap aTable输出的值为null,之前已经确认相应键的值确实在地图中?

非常感谢,

Froskoy。

哈希集合的键/元素,但如果覆盖了euqals则覆盖hashCode()。

你可以用。

public int hashCode() {
    return t.hashCode() * 31 ^ r.hashCode();
}

BTW:从你的代码看来, Integer r不能为null在这种情况下使用int r更有意义。

来自Object.equals()

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等的对象必须具有相等的哈希代码。

IIRC hashmap通过hashCode()而不是相等来查找,并且由于你没有实现hashcode,你使用与对象指针相等一致的默认实现 - 你需要实现适当的hashcode函数,它考虑了“T”参数以及整数(或不)

好的做法是hashCode()和equals()是一致的,但如果你知道自己在做什么,则不需要在结构上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM