我想创建一个以某个类为键的地图。我遇到的问题是,由于这个类包含指针,如果我使用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
答案 0 :(得分:9)
要将类的实例用作HashMap
中的键,您需要覆盖其hashCode
和equals
方法。一旦你这样做,一切都应该正常。
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一篇很好的文章,解释了如何覆盖这两种方法。