簡體   English   中英

從java.util.Map獲取值

[英]Getting values from java.util.Map

我有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

由於您使用HashMap存儲日期對象,因此必須覆蓋hashCode()方法,因為密鑰對象使用其hashCode存儲在數據結構中。

非常基本的hashCode()覆蓋(僅用於說明):

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

輸出:


hashmap使用hashCode函數對元素進行哈希處理。 對於大多數類型,哈希代碼是使用對象的引用計算的,這是Date的情況。 雖然在您的情況下,兩個日期具有相同的值,但它們不是同一個對象。 因此它們具有不同的引用,因此它們的哈希碼不同。 當您在尋找一個元素HashMap使用其的hashCode等為bhashCode是從不同的ahashCode你不能找到鍵的元素a使用b

您需要在Date類中實現hashCode()方法

在Date類中添加以下代碼

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

產量

sweet
sweet

因為String,Integer和所有包裝類都覆蓋hasCode並且等於該方法。 但在你的情況下,equals()方法將返回true,但你沒有覆蓋hasCode()方法,因此它將為a和b生成不同的哈希碼。所以map.get(b)將返回null值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM