假设我们有类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中的对象?
答案 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)
由于HashMap
有RegistrationPlate
作为键,因此您不能期望找到关键的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()
来搜索该对象。