如何使用对象作为键搜索hashmap?

时间:2016-11-24 01:28:15

标签: java

假设我们有类RegistrationPlate:

public class RegistrationPlate {
private final String regCode;
private final String country;

public RegistrationPlate(String country, String regCode) {
    this.regCode = regCode;
    this.country = country;
}

public String getRegCode() {
    return this.regCode;
}

public String getCountry() {
    return this.country;
}

@Override
public String toString() {
    return country + " " + regCode;
}

我有一个散列图,其中RegistrationPlate作为其键,所有者作为其值。如果我想在给定RegistrationPlate对象作为参数的情况下搜索此hashmap,我该怎么办?这就是我最初接触它的方式:

HashMap<RegistrationPlate, owner> vehicleRegister = new HashMap<RegistrationPlate, owner>();


public String getOwner(RegistrationPlate plate) {
    if (this.vehicleRegister.containsKey(plate.getRegCode())) {
        return "The owner is: " + this.vehicleRegister.get(plate);
    }
    return null;
}

我认为这里的逻辑可行,因为如果vehicleRegister包含注册码字符串作为键,它将返回下面的字符串。是否有更简洁的方法来访问hashmap中的对象?

4 个答案:

答案 0 :(得分:2)

您需要同时覆盖equals()的{​​{1}}和hashCode()

答案 1 :(得分:2)

要使用RegistrationPlate的对象作为HashMap的密钥,建议覆盖equals()的{​​{1}}和hashCode()方法。如果不重写RegistrationPlate方法,将发生以下情况:

equals()

覆盖RegistrationPlate rp1 = new RegistrationPlate(); RegistrationPlate rp2 = new RegistrationPlate(); rp1.equals(rp2); // returns false 时,您还需要覆盖equals()。如果没有这个,你会发现hashCode()的行为不一致,原因如下:

HashMap

答案 2 :(得分:1)

由于HashMapRegistrationPlate作为键,因此您不能期望找到关键的String。这意味着你应该

this.vehicleRegister.containsKey(plate)

而不是

this.vehicleRegister.containsKey(plate.getRegCode())

但是,您可以直接致电get()而无需先致电containsKey()

public String get(RegistrationPlate plate) {
    return "The owner is: " + this.vehicleRegister.get(plate);
}

更重要的是,您必须以equals()顺序覆盖hashcode()RegistrationPlate才能获得您想要的行为。否则,将使用默认实现,仅当密钥是对true中存储的完全相同的实例的引用时才返回HashMap。这种情况很少发生。您通常希望比较参考的内容

答案 3 :(得分:0)

boolean equals(Object obj)int hashCode()应该在RegistrationPlate类中重写。

HashMap使用hashCode()查找存储对象的组;它使用equals()来搜索该对象。