将对象映射为关键字

时间:2012-05-28 01:38:37

标签: java map

我想创建一个以某个类为键的地图。我遇到的问题是,由于这个类包含指针,如果我使用HashMap,则在散列时使用此地址(请参阅下面的代码)。我怎样才能比较实际值而不是地址,或者是否有其他容器可以使用它来实现相同的结果?

import java.util.*;
public class Main {
    public static void main(String args[]) {
        class Foo {
            public Foo(String a) {s = a;}
            public String s;
        }

        HashMap<Foo,Integer> a = new HashMap<Foo,Integer>();
        a.put(new Foo("test"), 1);
        System.out.println(a.get(new Foo("test")));
    }
}

这会输出null

2 个答案:

答案 0 :(得分:9)

要将类的实例用作HashMap中的键,您需要覆盖其hashCodeequals方法。一旦你这样做,一切都应该正常。

class Foo {
    public Foo(String a) {s = a;}
    public String s;
    int hashCode() {return s.hashCode();}
    boolean equals(Object other) {
        if (other == this) return true;
        if (!(other instanceof Foo)) return false;
        return ((Foo)other).s.equals(s);
    }
}

答案 1 :(得分:1)

请注意,您没有使用作为键来Map参数化,而是使用类Foo实例。如果您使用作为地图的类型参数,它看起来像这样:

Map<Class<Foo>,Integer> map;

如果您需要使用地图来处理Foo的实例,则了解您的代码不是上述情况:

Map<Foo,Integer> map;

...然后,您需要确保Foo覆盖both equals()hashCode(),以便一切正常。 Here's一篇很好的文章,解释了如何覆盖这两种方法。