今天在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也是可以跳過這個坑