Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java: HashMap with two keys

Tags:

java

hashmap

key

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

like image 365
lucad93 Avatar asked Jan 17 '26 22:01

lucad93


1 Answers

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.

like image 124
Andy Turner Avatar answered Jan 20 '26 11:01

Andy Turner