Java Tips | 基本ユーティリティ:Long.compare()

Web APP Java
スポンサーリンク
スポンサーリンク

Long.compare()とは何か

Javaで業務システムを開発していると、long型の数値同士を比較する場面が頻繁に登場します。

例えば、

  • 会員IDの比較
  • 注文番号の並び替え
  • 売上金額の比較
  • アクセス数のランキング
  • タイムスタンプの比較
  • 優先度の判定

などです。

そのような場面で便利なのが Long.compare() です。

Long.compare(値1, 値2)
Java

このメソッドは、2つのlong型の大小関係を比較し、その結果を整数値として返します。

特にソート処理やComparator実装では非常によく利用される実務向けユーティリティです。

まずはlong型を理解しよう

Long.compare()を理解する前に、long型について確認しましょう。

long型は、大きな整数を扱うためのデータ型です。

// long型
long memberId = 10000000000L;
Java

int型よりもはるかに大きな値を扱えます。

int型の最大値

2147483647

long型の最大値

9223372036854775807

そのため、大規模システムのID管理や大量データ処理で頻繁に利用されています。

Long.compare()の戻り値を理解しよう

初心者がまず覚えるべき重要なポイントです。

Long.compare()はtrueやfalseを返すメソッドではありません。

比較結果を次のルールで返します。

比較結果戻り値
第1引数が小さい負の値
第1引数と第2引数が同じ0
第1引数が大きい正の値

このルールを理解すればLong.compare()の使い方が分かります。

ステップバイステップで理解する

ステップ1:比較する値を準備する

// 会員ID
long memberId1 = 10000000001L;
long memberId2 = 20000000001L;
Java

ステップ2:Long.compare()を実行する

// 大小比較
int result =
        Long.compare(
                memberId1,
                memberId2
        );
Java

ステップ3:結果を確認する

// 結果表示
System.out.println(result);
Java

実行結果

-1

memberId1の方が小さいため負の値が返っています。

同じ値の場合

// 同じ注文番号
long orderId1 = 50000000001L;
long orderId2 = 50000000001L;

// 比較
int result =
        Long.compare(
                orderId1,
                orderId2
        );

System.out.println(result);
Java

実行結果

0

同じ値のため0が返ります。

第1引数の方が大きい場合

// アクセス数
long count1 = 10000L;
long count2 = 5000L;

// 比較
int result =
        Long.compare(
                count1,
                count2
        );

System.out.println(result);
Java

実行結果

1

count1の方が大きいため正の値が返ります。

内部でどのように動いているのか

イメージとしては次のような処理です。

// イメージコード
if (x < y) {

    return -1;

} else if (x == y) {

    return 0;

} else {

    return 1;

}
Java

実際の実装はさらに最適化されていますが、考え方は非常にシンプルです。

なぜLong.compare()が必要なのか

初心者の方は、

if (a > b)
Java

だけで十分ではないかと思うかもしれません。

確かに単純な比較なら問題ありません。

しかし実務ではソート処理やComparator実装が非常に多く登場します。

そのような場面ではLong.compare()が圧倒的に便利です。

実務で最もよく使われる場面:ソート処理

例えば注文番号一覧を昇順で並び替えるケースです。

// 注文番号一覧
List<Long> orderIds =
        Arrays.asList(
                500L,
                100L,
                300L
        );

// 昇順ソート
orderIds.sort(
        (a, b) ->
                Long.compare(a, b)
);

System.out.println(orderIds);
Java

実行結果

[100, 300, 500]

これがLong.compare()の代表的な利用方法です。

降順ソートも簡単にできる

// 降順ソート
orderIds.sort(
        (a, b) ->
                Long.compare(b, a)
);
Java

実行結果

[500, 300, 100]

引数を逆にするだけで実現できます。

オブジェクトのソートにも活躍する

業務システムではこちらの方が利用頻度が高い場合もあります。

class Order {

    private long orderId;

    public long getOrderId() {
        return orderId;
    }
}
Java
// 注文番号順ソート
orders.sort(
        (o1, o2) ->
                Long.compare(
                        o1.getOrderId(),
                        o2.getOrderId()
                )
);
Java

実務でよく見かけるコードです。

特に重要:引き算による比較は避ける

初心者がやりがちな比較方法があります。

// 危険な例
return (int)(a - b);
Java

一見正しく見えます。

しかしlong型ではオーバーフローの危険があります。

// 非常に大きい値
long a = Long.MAX_VALUE;
long b = Long.MIN_VALUE;

// 危険
long result = a - b;
Java

予期しない結果になる可能性があります。

そのため実務ではLong.compare()を利用することが推奨されています。

実務でよくある利用例

売上ランキング

// 売上順ソート
salesList.sort(
        (a, b) ->
                Long.compare(
                        b.getAmount(),
                        a.getAmount()
                )
);
Java

タイムスタンプ比較

// 更新日時比較
if (Long.compare(
        timestamp1,
        timestamp2
) > 0) {

    System.out.println(
            "timestamp1が新しい"
    );

}
Java

アクセス数順ソート

// アクセス順
pages.sort(
        (p1, p2) ->
                Long.compare(
                        p2.getAccessCount(),
                        p1.getAccessCount()
                )
);
Java

会員ID比較

// 会員ID比較
int result =
        Long.compare(
                memberId1,
                memberId2
        );
Java

Long.compareUnsigned()との違い

Long.compare()は符号付き整数として比較します。

// 通常比較
Long.compare(a, b);
Java

一方で、

// 符号なし比較
Long.compareUnsigned(a, b);
Java

は特殊用途です。

通常の業務システムではLong.compare()で十分です。

実務で使えるテンプレート集

基本比較テンプレート

// long比較
int result =
        Long.compare(a, b);
Java

昇順ソートテンプレート

// 昇順
list.sort(
        (a, b) ->
                Long.compare(a, b)
);
Java

降順ソートテンプレート

// 降順
list.sort(
        (a, b) ->
                Long.compare(b, a)
);
Java

オブジェクトソートテンプレート

// ID順
orders.sort(
        (o1, o2) ->
                Long.compare(
                        o1.getOrderId(),
                        o2.getOrderId()
                )
);
Java

情報セキュリティの観点から見る重要性

Long.compare()自体はセキュリティ機能ではありません。

しかし比較処理の誤りは業務システムに重大な影響を与えることがあります。

  • 優先度判定ミス
  • 権限レベル比較不具合
  • ランキング表示の誤り
  • 売上集計処理の不整合
  • 監査データの順序異常

特にlong型は大きな数値を扱うため、引き算比較によるオーバーフローの危険が高まります。

Long.compare()を利用することで、より安全で堅牢な比較処理を実現できます。

初心者が覚えておくべき重要ポイント

  • long型同士を比較するメソッドである
  • 負数・0・正数を返す
  • trueやfalseは返さない
  • ソート処理で非常によく利用される
  • Comparatorとの相性が良い
  • 引き算比較より安全である
  • 大規模システムのID比較でよく利用される

まとめ

Long.compare()は、long型同士の大小関係を安全に比較するためのJava標準メソッドです。

  • long型の比較結果を整数で返す
  • ソート処理で頻繁に利用される
  • Comparator実装を簡潔に書ける
  • 引き算比較によるオーバーフローを防げる
  • 大きな数値の比較に適している
  • 業務システムの保守性向上につながる
  • Java開発者が必ず覚えておきたい比較ユーティリティである

特に業務システムでは、会員ID、注文番号、売上金額、タイムスタンプなどlong型で管理されるデータが数多く存在します。Long.compare()を正しく活用することで、安全かつ読みやすい比較処理を実装できるようになり、ソート処理やランキング機能などでも信頼性の高いコードを書けるようになります。

タイトルとURLをコピーしました