java HashMap containsKey返回false虽然key存在

时间:2012-03-05 21:32:03

标签: java

我使用HashMap数据结构来存储SqMatrix(方阵),其中键的类型为MatrixIndex(包含row和col),值的类型为Integer。

但是当我作为“if(mat.containsKey(key))”的输出变为false时,尽管HashMap中有相应的键。

主要代码:

public static void main(String[] args) {

    Random generator = new Random();
    int val = 0;
    Types.MatrixIndex key, key1;
    int matSz = (int) Math.floor(Math.sqrt(10));
    Types.SqMatrix mat = new Types().new SqMatrix(matSz); //matSz*matSz elements
    //HashMap<Types.MatrixIndex,Integer> hMap= new HashMap<Types.MatrixIndex,Integer>(10);
    for (int r=0; r<matSz; r++) {
        for (int c=0; c<matSz; c++) {
            if (r<c) {
                val = generator.nextInt(2) > 0? -1 : val;
                key =(new Types()).new MatrixIndex(r, c);
                key1 = (new Types()).new MatrixIndex(c, r);
                mat.put(key, val);
                mat.put(key1, val);
                generator.setSeed(System.currentTimeMillis());
            }
        }
    }

    for (int r=0; r<matSz; r++) {
        val = 0;
        for (int c=0; c<matSz; c++) {
            if (r!=c) {
                key = (new Types()).new MatrixIndex(r, c);
                if (mat.containsKey(key)) {
                    val = val + mat.get(key);
                }

            }
        }
        key1 = (new Types()).new MatrixIndex(r, r);
        mat.put(key1, val);
    }

有没有人知道为什么containsKey返回false虽然它存在于HashMap中?

提前致谢,

索姆纳特

4 个答案:

答案 0 :(得分:6)

我不知道MatrixIndex是什么,但是如果它的哈希码实现没有被覆盖,那么MatrixIndex的每个实例都有它自己的哈希码,并且被认为是唯一的。因此,您无法传入MatrixIndex的新实例来执行containsKey()检查。

如果您希望确切的代码段有效,则需要覆盖MatrixIndex类中的equals()hashcode(),并使其始终为该类创建可重现的唯一值。

如果您之前没有这样做,请务必阅读覆盖这两种方法的内容。快速搜索将带来很多帮助。如果您可以向项目添加新库,请查看:http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/HashCodeBuilder.html

答案 1 :(得分:4)

您在equals()课程中(正确)定义了hashCode()MatrixIndex吗?

答案 2 :(得分:3)

要使containsKey()成功,两个对象(您测试的对象和Map的键中找到的对象)必须具有相同的hashCode()(对于非空对象)和{{1}必须[对称]为他们成功。

  

equals() “当且仅当此映射包含键k的映射时才返回true(key == null?k == null:key.equals(k))。(有)最多可以是一个这样的映射。)“reference)。

答案 3 :(得分:2)

很可能您忘记覆盖MatrixIndex.hashCode()和/或MatrixIndex.equals()。继承自Object类的默认版本比较对象标识,而不是对象的内容,并且不会执行您可能期望的操作。