在HashMap中用作键时,比较java中的日期

时间:2013-12-01 17:59:53

标签: java date hashmap

我试图使用带有java.util.Date的HashMap作为键,但我遇到了这个奇怪的问题。在执行以下操作时,我打印错误。

Date testDate = new Date(timeInLongFormat);

HashMap<Date,Integer> datesAndInts;
datesAndInts.put(testDate, 0);

Iterator iterator = datesAndInts.keySet().iterator();  

while (iterator.hasNext()) {  
    String key = iterator.next().toString();
    System.out.println("comparing " + testDate + "with " + key + " result is " + testDate.equals(key)); 
    // this call to equals() returns false.
    Integer testInt = datesList.get(key); // testInt is null, since the Date key cannot be found ...
}

我原本期望将Date作为键插入,而keySet返回的Date是相同的,但它们不是。这是正常的行为吗?为什么?我应该只比较时间或事物来实现我自己的Date子类吗?

4 个答案:

答案 0 :(得分:4)

您正在将Date个对象与String个对象进行比较。

Iterator<Date> iterator = datesAndInts.keySet().iterator();  
while (iterator.hasNext()) {  
    Date key = iterator.next();
    System.out.println("comparing " + testDate + "with " + key + " result is " + testDate.equals(key)); 
    // this call to equals() returns true now.
}

答案 1 :(得分:2)

显然,这将返回false:您将DateString进行比较。

如果您使用testDate.toString().equals(key),则返回true。

Date.equals()中的第一张支票:

public boolean equals(Object obj) {
    return obj instanceof Date && getTime() == ((Date) obj).getTime();
}

答案 2 :(得分:2)

您没有将日期与HashMap中的键进行比较(这将是完全相同的Date对象)。您正在将Date与String进行比较,这恰好是在日期调用toString()的结果。日期和字符串永远不会相等。

答案 3 :(得分:1)

Date的等值方法:Date.equals(Object)期望ObjectDate类型的实例,可以传递String,因为它是Object bu会导致{ {1}}:消息来源说:

false

再次记住,public boolean equals(Object obj) { return obj instanceof Date && getTime() == ((Date) obj).getTime(); } 方法将Date对象转换为form toString()的字符串表示形式,因此如果要比较String表示形式中的两个"EEE MMM dd HH:mm:ss zzz yyyy"实例,可能会遇到意外结果