通过用户对象从Hashmap获取值

时间:2016-12-19 20:13:47

标签: java dictionary hashmap

我有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

3 个答案:

答案 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;如果您希望行为像这样工作,则相等。使用全名作为密钥可能会更好,因为它通常是独一无二的,并且您实施的工作量较少。