JavaのcompareToとは?使い方・戻り値・実務での比較設計まで完全解説
CONTENTS
- 1 compareToとは?Comparableと自然順序の考え方
- 2 compareToの構文と戻り値(負・0・正)
- 3 戻り値の覚え方:「左 − 右」で考える
- 4 String.compareToで文字列を比較する
- 5 String.compareToIgnoreCaseの使いどころ
- 6 Number(Integerなど)のcompareToで数値比較
- 7 Date / Calendar / java.time のcompareTo
- 8 BigDecimal.compareToの最大の落とし穴
- 9 Comparatorで比較条件を外出しする
- 10 compareToでよくあるミスと注意点
- 11 プリミティブ比較はcompare系APIを使う
- 12 まとめ:compareToを理解するとJava設計が一段深まる
Javaでデータを並び替えたり、大小関係を判定したりするときに必ず登場するのが
compareToメソッド です。
Arrays.sort や Collections.sort を使った瞬間、裏側ではcompareToが呼ばれています。
ただし初心者の多くが、
- 戻り値が「負・0・正」とはどういう意味?
- -1 / 0 / 1が返ると思っていたら違った
- equalsとの違いがよく分からない
- Comparatorと何が違うのか混乱する
といった壁にぶつかります。
この記事では compareToの基礎から実務での設計判断まで を一気に整理します。
compareToとは?Comparableと自然順序の考え方

compareToの役割を一言でいうと
compareToは、オブジェクト同士の順序を決めるための共通ルールです。
このルールをクラスに与えるのが Comparable インターフェースです。
public interface Comparable<T> {
int compareTo(T o);
}
クラスがComparableを実装すると、
- そのクラスには 自然順序(デフォルトの並び順) が定義される
- sort系APIが追加設定なしで動く
という状態になります。
自然順序とは何か
自然順序とは、その型にとって 直感的で汎用的な並び順 です。
代表例は以下の通りです。
| 型 | 自然順序 |
|---|---|
| String | 辞書順 |
| Integer | 数値の昇順 |
| Date | 過去 → 未来 |
| BigDecimal | 数値としての大小 |
Collections.sort(list) が動くのは、要素のcompareToだけを見て並び替えているからです。
つまりcompareToは 「その型をソート可能にする共通言語」 と言えます。
設計上の注意点
自然順序は 誰が見ても納得できる並び にするのが重要です。
- 用途ごとに順序が変わる
- 画面ごとに並び替え条件が違う
このような場合、compareToに詰め込むと保守性が下がります。
その場合は後述する Comparatorで分離 するのが正解です。
compareToの構文と戻り値(負・0・正)

基本構文
left.compareTo(right);
- 呼び出し側:left
- 引数:right
戻り値の意味
compareToは int型 を返しますが、重要なのは数値そのものではありません。
| 戻り値 | 意味 |
|---|---|
| 負の値 | left < right |
| 0 | left == right |
| 正の値 | left > right |
❌ よくある誤解
「-1 / 0 / 1が返る」と思っている人が多いですが、保証されていません。
"a".compareTo("A"); // 32 などになることがある
正しい判定方法
int result = a.compareTo(b);
if (result < 0) {
// aが小さい
} else if (result == 0) {
// 等しい
} else {
// aが大きい
}
特定の数値に依存しない 書き方が必須です。
ここまで読んで、
「頭では分かるけど、実際にどんな数値が返るのか不安」
「-1 / 0 / 1以外が返るケースを自分で確かめたい」
と感じた方も多いと思います。
compareToは、実際にコードを動かしてみると
戻り値の感覚が一気に腹落ちします。
環境構築なしで、ブラウザ上ですぐJavaを実行できる
学習サービス「ZeroCodePlus」なら、
・compareToの戻り値をその場で確認できる
・String / Integer / BigDecimal の挙動を比較できる
・間違えても即やり直せる
といった形で、この記事の内容を“体感”できます。
戻り値の覚え方:「左 − 右」で考える
compareToが混乱する最大の理由は 視点 です。
常に 呼び出し側(左)視点 で考えます。
1.compareTo(2); // 負
2.compareTo(1); // 正
「左 − 右」のイメージで覚えると判断が速くなります。
ただし実装として引き算しているとは限りません。
オーバーフローや型差異があるため、覚え方として使うだけ にしましょう。
String.compareToで文字列を比較する

基本動作
StringのcompareToは Unicodeコードポイント順 で比較します。
"a".compareTo("b"); // 負
"abc".compareTo("abd"); // 負
"abc".compareTo("ab"); // 正(長いほうが大きい)
先頭から順に比較し、最初に差が出た文字で決まります。
注意点:人間の辞書順ではない
- ロケール(五十音順など)は考慮されない
- 大文字と小文字は別文字扱い
表示順が重要な場合は、Collatorなど別の仕組みを使います。
String.compareToIgnoreCaseの使いどころ
"a.compareToIgnoreCase("A"); // 0
- ユーザー入力
- 検索結果
- 一覧表示
こうした場面では大小文字を区別しない方がUXが良くなります。
ただし、言語依存の並び順までは保証しません。
本格的な表示順制御はComparatorで設計します。
Number(Integerなど)のcompareToで数値比較
ラッパークラスはすべてComparableを実装しています。
Integer a = 1;
Integer b = 10;
a.compareTo(b); // 負
b.compareTo(a); // 正
実務でのメリット
- TreeMap / TreeSetと相性が良い
- ソートロジックを意識せず使える
注意点:プリミティブ型
int や long にはcompareToがありません。
Integer.compare(a, b);
Long.compare(x, y);
引き算比較(a - b)はオーバーフローの危険があるため避けましょう。
Date / Calendar / java.time のcompareTo
Date / Calendar
- 内部のミリ秒値で比較
- 過去 → 負、未来 → 正
落とし穴は 時刻まで含む 点です。
2026-01-31 00:00 2026-01-31 12:00
同じ日でもcompareToは0になりません。
java.time系が推奨される理由
- LocalDate:日付のみ
- LocalDateTime:日時
- ZonedDateTime:タイムゾーン込み
型が意図を表すため、バグを減らせます。
BigDecimal.compareToの最大の落とし穴

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
a.compareTo(b); // 0
a.equals(b); // false
compareToとequalsの違い
| メソッド | 判定基準 |
|---|---|
| compareTo | 数値としての大小 |
| equals | 値 + scale |
実務での指針
- 金額比較 → compareTo
- 入力値完全一致 → equals
- 保存前にscale正規化 → 安全設計
BigDecimalについてはぜひこちらの記事もご参考ください!
Comparatorで比較条件を外出しする
なぜComparatorが必要か
Comparableは 自然順序は1つだけ です。
- 名前順
- 登録日順
- 最終ログイン順
これらをcompareToに詰め込むのは破綻します。
thenComparingの例
Comparator<User> comparator = Comparator.comparing(User::getLastName)
.thenComparing(User::getFirstName)
.thenComparing(User::getId);
読みやすく、意図が明確になります。
compareToでよくあるミスと注意点

戻り値を-1/0/1だと決め打ちする
❌ result == -1
⭕ result < 0
equalsとの不整合
TreeSet / TreeMapでは compareToが0なら同一扱い になります。
equalsがfalseでも重複排除されるため注意が必要です。
null比較
- 多くのcompareToはnullでNPE
- Comparator.nullsFirst / nullsLastで制御
プリミティブ比較はcompare系APIを使う
Integer.compare(a, b);
Long.compare(x, y);
- オーバーフロー防止
- オートボクシング回避
- パフォーマンス向上
まとめ:compareToを理解するとJava設計が一段深まる
compareToは Javaにおける比較の基礎インフラ です。
- 戻り値は「負・0・正」だけを見る
- 呼び出し側視点を固定する
- 自然順序は汎用的に
- 用途別はComparatorで分離
これを押さえると、
文字列・数値・日時・BigDecimal・ソート設計まで一気に繋がります。
compareToは、一度理解すると
- 文字列比較
- 数値比較
- 日付の並び替え
- ソート設計
といったJavaの基礎〜実務設計まで一気につながる重要APIです。
ただし本当の理解は、
「読んだ」ではなく「書いて、動かして、間違えた」先にあります。
もし、
- 独学で理解が曖昧なまま進んでしまいがち
- 環境構築でつまずきたくない
- 実務で使うレベルまで一気に引き上げたい
と感じているなら、
ブラウザだけでJavaを実行できる学習コンテンツZeroCodePlus を活用してみてください。
compareTo・Comparator・sort系APIも、実際にコードを書いて確認できます。