MEDIA

メディア

  1. TOP
  2. メディア
  3. プログラミング
  4. JavaのcompareToとは?使い方・戻り値・実務での比較設計まで完全解説

JavaのcompareToとは?使い方・戻り値・実務での比較設計まで完全解説

Javaでデータを並び替えたり、大小関係を判定したりするときに必ず登場するのが
compareToメソッド です。

Arrays.sortCollections.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を実際に動かして確認したい方はこちら(ZeroCodePlus)

戻り値の覚え方:「左 − 右」で考える

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と相性が良い
  • ソートロジックを意識せず使える

注意点:プリミティブ型

intlong には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:タイムゾーン込み

型が意図を表すため、バグを減らせます。

JavaのData型などはこちらの記事もご参考ください!

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も、実際にコードを書いて確認できます。

👉 Javaを「使える知識」に変えたい方はこちら(ZeroCodePlus)

Join us! 未経験からエンジニアに挑戦できる環境で自分の可能性を信じてみよう 採用ページを見る→

記事監修

ドライブライン編集部

[ この記事をシェアする ]

記事一覧へ戻る