1

从哈希图中检索值时出现问题。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++;
}

正如人们所期望的那样,i 最后保留了值 112,并且正如预期的那样,相等性测试仅对一个条目打印为 true。

但是,当我这样做时

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,而之前已经确认对应键的值确实在map中?

非常感谢,

弗罗斯科伊。

4

2 回答 2

3

Hash 集合的键/元素,但如果 euqals 被覆盖,则覆盖 hashCode()。

你可以用。

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

顺便说一句:从您的代码看来,在这种Integer r情况null下使用int r更有意义。

Object.equals()

请注意,每当重写该方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

于 2012-09-17T12:13:42.630 回答
1

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

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

于 2012-09-17T12:16:39.167 回答