从java.util.Map获取值

时间:2013-11-05 13:07:53

标签: java map hashmap

我有Map<Date, String。我有两个相等的Date对象a, b。我将字符串值放入与键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 个答案:

答案 0 :(得分:5)

由于您使用HashMap来存储日期对象,因此必须覆盖hashCode()方法,因为密钥对象使用其hashCode存储在数据结构中。

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

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

输出:

  甜蜜的   甜

答案 1 :(得分:2)

散列映射使用hashCode函数散列元素。对于大多数类型,哈希代码是使用对象的引用计算的,这是Date的情况。虽然在您的情况下,两个日期具有相同的值,但它们不是同一个对象。因此它们具有不同的引用,因此它们的哈希码不同。当您在HashMap中查找元素时,会使用其hashCode,因此b的{​​{1}}与hashCode的{​​{1}}不同,您找不到使用a的键hashCode的元素。

答案 2 :(得分:1)

您需要在hashCode()

中实施Date方法

在Date类中添加以下代码

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

<强>输出

sweet
sweet

答案 3 :(得分:0)

因为String,Integer和所有包装类都覆盖hasCode并且等于该方法。 但在你的情况下,equals()方法将返回true,但你没有覆盖hasCode()方法,因此它将为a和b生成不同的哈希码。所以map.get(b)将返回null值。