i'm trying to build a HashMap having two keys in this way: first i created a class which is only a data structure.
public class Tarta {
public String nome;
public String data;
public Tarta(String nome, String data) {
this.nome = nome;
this.data = data;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
Then i populated my map by writing this in another class:
mappaTarta.put(new Tarta(nome, data), peso);
During compilation i had no errors, but when testing i got null, for example:
System.out.println(lr.leggiRecord().get(new Tarta("R", "15/11/2015")));
Can you kindly explain me why? Thankyou
If you want to use items as keys in a HashMap
, you need to override their equals
and hashCode
methods. Otherwise, the default implementations will consider two instances created with identical parameters as different, because they are two different instances.
Currently:
Tarta a = new Tarta("foo", "bar");
Tarta b = new Tarta("foo", "bar");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // false
System.out.println(a.hashCode() == b.hashCode()); // false
Example implementations:
@Override public boolean equals(Object other) {
if (other == this) return true;
if (other instanceof Tarta) {
Tarta that = (Tarta) other;
return Objects.equals(this.name, that.name)
&& Objects.equals(this.data, that.data);
}
return false;
}
@Override public int hashCode() {
return Objects.hash(name, data);
}
Then:
Tarta a = new Tarta("foo", "bar");
Tarta b = new Tarta("foo", "bar");
System.out.println(a == b); // false - they are still different instances
System.out.println(a.equals(b)); // true
System.out.println(a.hashCode() == b.hashCode()); // true
Note that it is also advisable only to use immutable objects as keys in HashMaps: you should make name
and data
final at the very least, and make the class final
too to make it truly immutable.
Java VM uses the Object.hashCode() and Object.equals(Object) to compare object so basicaly it dont know how to compare the Tarta Object and you need to override those methods i mentioned to work! Sory about my english
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.