JavaのDateクラスequalsメソッド完全解説!初心者でもわかる日付の等価比較
生徒
「Javaで日付同士が同じかどうかを判定するには、どんな方法がありますか?」
先生
「それにはjava.util.Dateクラスのequalsメソッドを使う方法がありますよ。」
生徒
「文字列の比較とは違うんですか?」
先生
「はい、日付の比較は文字列や数値とは少し違います。equalsメソッドはDateクラス専用のルールで動くので、しっかり理解しておきましょう!」
1. java.utilパッケージとDateクラスの概要
Javaで日付や時刻を扱う際には、java.utilパッケージに含まれるDateクラスが長年使われてきました。現在ではjava.timeパッケージのLocalDateやLocalDateTimeなども利用されていますが、古いシステムやライブラリでは依然としてDateが使われていることがあります。
Dateクラスは、ミリ秒単位で日付や時刻を保持するための基本的なクラスで、日付の比較や等価チェックに使われる重要なクラスです。
2. equalsメソッドとは何か?
equalsメソッドは、2つのオブジェクトが「等しい」かどうかを判定するためのJavaの基本メソッドです。Objectクラスで定義されており、各クラスで適切にオーバーライドされています。
Dateクラスでは、2つのDateオブジェクトのミリ秒までの時刻が完全に一致するかを判定するために、このequalsメソッドが使われます。
3. Dateクラスのequalsメソッドの使い方
それでは実際にequalsメソッドを使って、2つのDateオブジェクトが同じかどうかを判定してみましょう。
import java.util.Date;
public class DateEqualsExample {
public static void main(String[] args) throws InterruptedException {
Date date1 = new Date();
Thread.sleep(1000); // 1秒待つ
Date date2 = new Date();
boolean isEqual = date1.equals(date2);
System.out.println("同じ日付か?:" + isEqual);
}
}
同じ日付か?:false
このように、作成時刻がわずかでも異なるとequalsはfalseになります。
4. equalsで比較するポイントと注意点
java.util.Dateのequalsメソッドを使う際の注意点は以下の通りです:
- 比較対象が
nullだとfalseになります(例外にはなりません) - ミリ秒単位で一致しなければ
falseになるため、タイミングによっては「同じ日付でも一致しない」ことがあります - 時刻の表示形式が同じでも、内部のミリ秒が違えば一致しません
たとえば、「2025年9月4日 午前10時0分0秒000」と「2025年9月4日 午前10時0分0秒500」ではequalsの結果はfalseになります。
5. 同じ日付かどうかを判断する別の方法
equalsでは「厳密に同じ時刻か」を判定しますが、「年月日だけで比較したい」という場面も多くあります。その場合は、CalendarやSimpleDateFormatを使って日付のフォーマットを整える方法があります。
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateEqualsDayOnly {
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date1 = sdf.parse("20250904");
Date date2 = sdf.parse("20250904");
System.out.println("日付のみ比較:" + date1.equals(date2));
}
}
日付のみ比較:true
このように、日付のフォーマットを整えればequalsで意図した比較ができます。
6. equalsと==の違い
Javaの初心者が混乱しやすいのがequalsと==の違いです。
equals:値の内容が同じかどうかを比較==:参照先のオブジェクトが同じかどうかを比較
たとえば次のようなコードでは、equalsはtrueでも、==はfalseになります。
Date a = new Date();
Date b = new Date(a.getTime());
System.out.println(a.equals(b)); // true
System.out.println(a == b); // false
7. equalsはListやMapにも影響する
equalsはHashMapやArrayListなどのコレクションでも使われます。Dateがキーとして使われる場合、equalsとhashCodeが一致しなければ期待通りに動作しません。
import java.util.*;
public class DateMapExample {
public static void main(String[] args) {
Date date1 = new Date();
Date date2 = new Date(date1.getTime());
Map<Date, String> map = new HashMap<>();
map.put(date1, "登録済み");
System.out.println(map.get(date2)); // "登録済み"が出力される
}
}
登録済み
このように、equalsの動作はコレクションの中でも非常に重要です。