我试图使用带有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子类吗?
答案 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:您将Date
与String
进行比较。
如果您使用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)
期望Object
是Date
类型的实例,可以传递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"
实例,可能会遇到意外结果