今天在JDK6上做開發,遇到一個很詭異的問題。
Domain中一個實體是Date,稱為變量 a,
使用Calendar構造出來的Date,稱為變量b,
雖然都是同一天,比如 2016-11-11 00:00:00,但是調用equals的結果卻是不一樣,為什么會出現這個情況?
System.out.println(a.equals(b)); // false
System.out.println(b.equals(a)); // true
Domain的變量來自Hibernate,雖然其類型描述為java.util.Date,但是其真實類型是Timestamp,其equals方法為
public boolean equals(java.lang.Object ts) {
if (ts instanceof Timestamp) {
return this.equals((Timestamp)ts);
} else {
return false; // 直接返回false
}
}
而java.util.Date的equals方法為
public boolean equals(Object obj) {
return obj instanceof Date && getTime() == ((Date) obj).getTime(); // 比較的是毫秒值,因此返回true
}
總結:所以這些看似同一個類的equals比較還需要看其真實類型的比較
可以使用getTime()方法跳過這個坑,如果使用JDK8的LocalDateTime也是可以跳過這個坑
