Метод hashCode() с использованием HashMap
Должен ли я переопределить hashCode()
метод, если я собираюсь настроить HashMap
?
UPD: например:
import java.util.HashMap;
import java.util.Objects;
/**
*
* @author dolgopolov.a
*/
public class SaltEntry {
private long time;
private String salt;
/**
* @return the time
*/
public long getTime() {
return time;
}
/**
* @param time the time to set
*/
public void setTime(long time) {
this.time = time;
}
/**
* @return the salt
*/
public String getSalt() {
return salt;
}
/**
* @param salt the salt to set
*/
public void setSalt(String salt) {
this.salt = salt;
}
public boolean equals(SaltEntry o) {
if (salt.equals(o.getSalt()) && time == o.getTime()) {
return true;
} else {
return false;
}
}
public int hashCode() {
return Objects.hash(String.valueOf(salt + time));
}
public static void main(String[] args) {
SaltEntry se1 = new SaltEntry(), se2 = new SaltEntry();
se1.setSalt("1");
se2.setSalt("1");
se1.setTime(1);
se2.setTime(1);
HashMap<String, SaltEntry> hm = new HashMap<String, SaltEntry>();
hm.put("1", se1);
hm.put("2", se2);
System.out.println(hm.get("1").getSalt());
}
}
1 ответ
Решение
Вы должны переопределить оба hashCode()
а также equals()
класса A
если вы собираетесь использовать A
как ключ в HashMap
и нужна другая форма равенства, чем эталонное равенство.
Маленькая хитрость к инструментам hashcode()
начиная с Java 7: использовать Objects#hash(Object...)
,
Например:
public class A {
Object attr1, attr2, /* ... , */ attrn ;
@Override
public int hashcode() {
return Objects.hash(attr1, attr2, /* ... , */ attrn);
}
}