4

我有Map<Date, String。我有两个a, b相等的 Date 对象。我将一个字符串值放入与 key 关联的映射中a。然后我尝试获取与键关联的映射值ab但只a返回我输入的值。是否有可能用b钥匙获得我的价值。我知道当键是简单的字符串时这是可能的。为什么这不适用于其他类型的对象?

public class Main {

public static void main(String[] args) {
    Map<Date, String> map = new HashMap<Date, String>();

    Date a = new Date(20131105);
    Date b = new Date(20131105);

    map.put(a, "sweet");

    System.out.println(map.get(a));
    System.out.println(map.get(b));
}

static class Date {
    private int ymd;

    public Date(int ymd) {
        this.ymd = ymd;
    }

    public int getYmd() {
        return ymd;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Date) {
            return ((Date) obj).ymd == ymd;
        }
        return false;
    }
}

}

输出是:

sweet
null
4

4 回答 4

5

由于您使用的HashMap是存储日期对象的方法,因此您必须重写该hashCode()方法,因为关键对象使用它们的 hashCode 存储在数据结构中。

非常基本hashCode()的覆盖(仅用于说明):

@Override
public int hashCode(){
   return ymd;
}

输出 :

甜甜

于 2013-11-05T13:08:43.203 回答
2

哈希图使用其hashCode函数对元素进行哈希处理。对于大多数类型,哈希码是使用对象的引用计算的,Date 就是这种情况。虽然在您的情况下,这两个日期具有相同的值,但它们不是同一个对象。因此它们具有不同的引用,因此它们的哈希码也不同。当您在 a 中查找一个元素时,HashMap它的 hashCode 被使用,因此 's 与b's不同hashCode,您无法通过 using找到带有键的元素。ahashCodeab

于 2013-11-05T13:13:31.790 回答
1

你需要在你的类中实现hashCode()方法Date

在您的 Date 类中添加以下代码

    @Override
    public int hashCode() {              
          return ymd;
    }

输出

sweet
sweet
于 2013-11-05T13:14:10.700 回答
0

因为 String、Integer 和所有包装类都覆盖了 hasCode 和 equals 两种方法。但是在您的情况下, equals() 方法将返回 true 但您没有覆盖 hasCode() 方法,因此它将为 a 和 b 生成不同的哈希码。因此 map.get(b) 将返回空值。

于 2013-11-05T14:41:19.667 回答