我有hashmap
HashMap<Man, Double> d = new HashMap<>();
然后我添加新配对。
d.put(new Man("John"), 5.);
如何从此地图中检索此对? 我试着这样做:
Man man = new Man("John");
System.out.println(d.get(man));
但结果是null
,而我期待5
。
答案 0 :(得分:5)
只有当您覆盖类equals(Object obj)
中的方法hashCode()
和Man
时,才能使HashMap
了解即使如果它们不是相同的实例,则它们具有相同的内容,应该被视为地图中的相同键。
假设您的班级Man
类似于:
public class Man {
private final String name;
public Man(final String name) {
this.name = name;
}
...
}
如果您要求 IDE 为您生成方法,您会得到以下内容:
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
final Man man = (Man) o;
return Objects.equals(this.name, man.name);
}
@Override
public int hashCode() {
return Objects.hash(this.name);
}
答案 1 :(得分:2)
您需要有一些独特的东西来定义对象Man
。
在您的情况下,它似乎是 - name
。
因此,您使用equals()
作为唯一标识符,覆盖hashcode()
方法以及Man
类中的name
方法。
由于name
是一个字符串,您可以将任务委托给String
类中的类似方法。
答案 2 :(得分:1)
HashMap工作正常。仅仅因为你制作了两个同名的新对象,并不意味着计算机认为它们是同一个对象。
尝试以下方法:
man1 = new Man("John");
man2 = new Man("John");
if (man1 == man2) {
System.out.println("Equal");
} else {
System.out.println("Not equal");
}
你会得到&#34;不平等&#34;因为计算机正在检查它们是否是完全相同的对象,而不仅仅是命名相同。
每次您使用&#34; new&#34;关键字,您要声明一个新对象,并且计算机会为其提供唯一的地址。
试试这个:
man1 = new Man("John");
HashMap<Man, Double> myList = new HashMap<>();
myList.put(man1, "5.00");
System.out.print.ln(myList.get(man1));
你现在会看到你&#34; 5.00&#34;因为你实际上正在给它确切的对象,这是地图中的关键。
您需要手动定义您如何决定两个男人&#34;如果您希望行为像这样工作,则相等。使用全名作为密钥可能会更好,因为它通常是独一无二的,并且您实施的工作量较少。