Java - 从 HashMap 中检索对象

标签 java 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 个子类中的任何一个。

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

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))));

尽管上面的代码片段确认 map 中确实有一个条目恰好具有此键,但输出为 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() 方法都被类似地覆盖并且表现得像预期的那样。

为什么之前已经确认对应键的值确实在map中,hashmap aTable输出的值是null?

非常感谢,

弗罗斯科伊。

最佳答案

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

你可以使用。

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

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

来自 Object.equals()

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

关于Java - 从 HashMap 中检索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12458894/

相关文章:

java - 我如何使用同步原语来帮助 Waiters 服务 java 中的表?

java - 在具有数百万个对象(具有不同键)的 HashMap 中以 O(1) 时间插入/删除?

Java Map 与 TimeToLive 与每个键/值对相关联

java - HashMap 中的 keySet() 方法可能更简洁

Java HashMap 性能优化/替代

java - 将 Map<String,String> 转换为 Map<String,Object>

Java - 在 OpenCV 中读取帧

java - 无法在一维和二维数组值之间转换

java - 在 Java 中,哪种集合对于数据网络来说性能最高?

java - Http 请求无响应 : Apache Tomcat