当前位置:  开发笔记 > 编程语言 > 正文

Java:带有两个键的HashMap

如何解决《Java:带有两个键的HashMap》经验,为你挑选了1个好方法。

我正在尝试用这种方式构建一个有两个键的HashMap:首先我创建了一个只是数据结构的类.

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;
    }
}

然后我通过在另一个类中写这个来填充我的地图:

mappaTarta.put(new Tarta(nome, data), peso);

在编译期间我没有错误,但是在测试时我得到了null,例如:

System.out.println(lr.leggiRecord().get(new Tarta("R", "15/11/2015")));

你能解释一下为什么吗?谢谢



1> Andy Turner..:

如果要将项目用作a中的键HashMap,则需要覆盖它们equalshashCode方法.否则,默认实现将考虑使用相同参数创建的两个实例,因为它们是两个不同的实例.

目前:

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

示例实现:

@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);
}

然后:

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

请注意,建议仅将不可变对象用作HashMaps中的键:您应该至少制作namedata最终,并使类final也使其真正不可变.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有