2

我想创建一个以某个类为键的地图。我遇到的问题是,由于此类包含指针,因此如果我使用 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

4

2 回答 2

9

为了将类的实例用作 a 中的键,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);
    }
}
于 2012-05-28T01:40:21.937 回答
1

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

Map<Class<Foo>,Integer> map;

如果您需要地图与以下实例一起使用,请了解上述情况不适用于您的代码Foo

Map<Foo,Integer> map;

...然后您需要确保Foo覆盖两者 equals()并且hashCode()一切正常。这是一篇很好的文章,解释了如何覆盖这两种方法。

于 2012-05-28T01:45:09.080 回答