[Java] Longラッパークラスの使い方

JavaのLongラッパークラスは、基本データ型longのオブジェクトを扱うためのクラスです。

主な使い方として、数値の変換や比較、計算を行うメソッドが提供されています。

例えば、Long.valueOf(String s)を使って文字列をLongオブジェクトに変換したり、Long.parseLong(String s)で文字列を基本データ型longに変換できます。

また、Long.compare(long x, long y)で2つのlong値を比較することも可能です。

Longクラスは不変でスレッドセーフです。

この記事でわかること
  • Longラッパークラスの基本的な特徴と使い方
  • Longとlongの違いと使い分け
  • Longラッパークラスのメソッドを用いた数値操作
  • コレクションやマルチスレッド環境でのLongの応用例
  • Longラッパークラスを使用する際の注意点とその対策

目次から探す

Longラッパークラスとは

Longラッパークラスの概要

JavaのLongラッパークラスは、基本データ型であるlongをオブジェクトとして扱うためのクラスです。

java.langパッケージに含まれており、数値をオブジェクトとして操作する際に便利です。

特に、コレクションフレームワークなど、オブジェクトとしての操作が必要な場面で使用されます。

スクロールできます
特徴説明
パッケージjava.lang
サイズ64ビット
最大値9,223,372,036,854,775,807
最小値-9,223,372,036,854,775,808

基本データ型longとの違い

longはJavaの基本データ型で、64ビットの整数を表現します。

一方、Longはそのラッパークラスで、longをオブジェクトとして扱うことができます。

以下に、longLongの主な違いを示します。

スクロールできます
特徴longLong
プリミティブ型オブジェクト型
初期値0null
使用例数値演算コレクション

オートボクシングとアンボクシング

Javaでは、基本データ型とその対応するラッパークラスの間で自動的に変換が行われる機能があります。

これをオートボクシングとアンボクシングと呼びます。

  • オートボクシング: 基本データ型からラッパークラスへの自動変換。
  • 例:Long longObj = 10L; // long型の10LがLongオブジェクトに変換される
  • アンボクシング: ラッパークラスから基本データ型への自動変換。
  • 例:long num = longObj; // Longオブジェクトがlong型に変換される

これらの機能により、基本データ型とラッパークラスの間での変換が容易になり、コードの可読性が向上します。

Longラッパークラスの基本的な使い方

Longオブジェクトの生成

Longラッパークラスのオブジェクトを生成する方法はいくつかあります。

以下に代表的な方法を示します。

  1. コンストラクタを使用する方法:
   Long longObj1 = new Long(100L);

これは非推奨の方法で、Java 9以降では使用しないことが推奨されています。

  1. valueOfメソッドを使用する方法:
   Long longObj2 = Long.valueOf(100L);

この方法はキャッシュを利用するため、効率的です。

  1. オートボクシングを利用する方法:
   Long longObj3 = 100L;

自動的にlong型からLongオブジェクトに変換されます。

文字列からLongへの変換

文字列をLongオブジェクトに変換するには、Long.parseLongメソッドLong.valueOfメソッドを使用します。

String numberStr = "12345";
Long longObj = Long.parseLong(numberStr);

または、

Long longObj = Long.valueOf(numberStr);

これらのメソッドは、文字列が数値として正しい形式であることを前提としています。

そうでない場合、NumberFormatExceptionがスローされます。

Longから文字列への変換

Longオブジェクトを文字列に変換するには、toStringメソッドを使用します。

Long longObj = 12345L;
String numberStr = longObj.toString();

または、String.valueOfメソッドを使用することもできます。

String numberStr = String.valueOf(longObj);

これらの方法により、Longオブジェクトを簡単に文字列に変換することができます。

これにより、数値を文字列として表示したり、文字列操作を行うことが可能になります。

Longラッパークラスのメソッド

数値の比較

compareメソッドの使い方

compareメソッドは、2つのLong値を比較し、その大小関係を示す整数を返します。

Long a = 100L;
Long b = 200L;
int result = Long.compare(a, b); // aがbより小さいので、resultは-1
  • resultが0の場合、abは等しい。
  • resultが負の場合、abより小さい。
  • resultが正の場合、abより大きい。

equalsメソッドの使い方

equalsメソッドは、2つのLongオブジェクトが等しいかどうかを判定します。

Long a = 100L;
Long b = 100L;
boolean isEqual = a.equals(b); // aとbは等しいので、isEqualはtrue

equalsメソッドは、オブジェクトの値が等しい場合にtrueを返します。

数値の演算

sumメソッドの使い方

sumメソッドは、2つのlong値の合計を返します。

long a = 100L;
long b = 200L;
long sum = Long.sum(a, b); // sumは300

このメソッドは、単純に2つの数値を加算するために使用されます。

maxとminメソッドの使い方

maxメソッドminメソッドは、それぞれ2つのlong値のうち、最大値と最小値を返します。

long a = 100L;
long b = 200L;
long max = Long.max(a, b); // maxは200
long min = Long.min(a, b); // minは100

これらのメソッドは、数値の比較を簡単に行うために使用されます。

ビット演算

bitCountメソッドの使い方

bitCountメソッドは、long値の2進数表現における1のビット数を返します。

long value = 15L; // 2進数で1111
int bitCount = Long.bitCount(value); // bitCountは4

このメソッドは、ビット操作を行う際に便利です。

rotateLeftとrotateRightメソッドの使い方

rotateLeftメソッドrotateRightメソッドは、long値のビットを左または右に回転させます。

long value = 1L; // 2進数で0001
long rotatedLeft = Long.rotateLeft(value, 2); // rotatedLeftは4 (2進数で0100)
long rotatedRight = Long.rotateRight(value, 2); // rotatedRightは4611686018427387904 (2進数で1000...0001)

これらのメソッドは、ビットシフト操作を行う際に使用されます。

Longラッパークラスの応用例

コレクションでの使用

Javaのコレクションフレームワークはオブジェクトを扱うため、Longラッパークラスはlong型の数値をコレクションに格納する際に役立ちます。

以下は、ArrayListLongオブジェクトを格納する例です。

import java.util.ArrayList;
import java.util.List;
public class App {
    public static void main(String[] args) {
        List<Long> longList = new ArrayList<>();
        longList.add(100L);
        longList.add(200L);
        longList.add(300L);
        for (Long number : longList) {
            System.out.println(number);
        }
    }
}
100
200
300

この例では、ArrayListLongオブジェクトを追加し、リスト内の各要素を出力しています。

Longラッパークラスを使用することで、long型の数値を簡単にコレクションに格納できます。

マルチスレッド環境での使用

マルチスレッド環境では、Longラッパークラスを使用する際に注意が必要です。

Longは不変オブジェクトであるため、スレッドセーフですが、AtomicLongを使用することで、スレッド間での数値の安全な更新が可能です。

import java.util.concurrent.atomic.AtomicLong;
public class App {
    private static AtomicLong counter = new AtomicLong(0);
    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 1000; i++) {
                counter.incrementAndGet();
            }
        };
        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);
        thread1.start();
        thread2.start();
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Final counter value: " + counter.get());
    }
}
Final counter value: 2000

この例では、AtomicLongを使用してスレッド間で安全にカウンターを更新しています。

データベースとの連携

データベースとの連携において、Longラッパークラスは、データベースのBIGINT型と対応するために使用されます。

JDBCを使用してデータベースからBIGINT型のデータを取得し、Longオブジェクトとして扱うことができます。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class App {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "username";
        String password = "password";
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            String query = "SELECT id FROM my_table WHERE name = ?";
            PreparedStatement stmt = conn.prepareStatement(query);
            stmt.setString(1, "example");
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                Long id = rs.getLong("id");
                System.out.println("ID: " + id);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

この例では、データベースからBIGINT型idを取得し、Longオブジェクトとして扱っています。

Longラッパークラスを使用することで、データベースの数値型とJavaの数値型をスムーズに連携できます。

Longラッパークラスの注意点

パフォーマンスの考慮

Longラッパークラスを使用する際には、パフォーマンスに注意が必要です。

Longはオブジェクトであるため、longのようなプリミティブ型に比べてメモリ消費が大きく、処理速度も遅くなる可能性があります。

特に、大量の数値を扱う場合や頻繁に数値演算を行う場合は、longを使用する方が効率的です。

  • オートボクシングの影響: longからLongへの変換(オートボクシング)やその逆(アンボクシング)は、暗黙的に行われるため、パフォーマンスに影響を与えることがあります。
  • キャッシュの利用: Long.valueOfメソッドは、-128から127の範囲の値をキャッシュするため、この範囲内の値を頻繁に使用する場合は、valueOfを利用することでパフォーマンスを向上させることができます。

NullPointerExceptionの回避

Longはオブジェクトであるため、nullを許容します。

これにより、null値を扱う際にNullPointerExceptionが発生する可能性があります。

以下のような状況で注意が必要です。

  • アンボクシング時の例外: Longオブジェクトがnullの場合、アンボクシングを行うとNullPointerExceptionが発生します。
  • 例:Long longObj = null; long num = longObj; // 例外が発生
  • 対策: nullチェックを行うか、Optionalクラスを使用してnullの可能性を管理することが推奨されます。

不変オブジェクトとしての特性

Longラッパークラスは不変オブジェクトです。

一度作成されたLongオブジェクトの値は変更できません。

この特性は、スレッドセーフな操作を行う際に有利ですが、値を変更する必要がある場合には新しいオブジェクトを生成する必要があります。

  • 利点: 不変オブジェクトはスレッドセーフであり、複数のスレッドから同時にアクセスされても安全です。
  • 欠点: 値を変更するたびに新しいオブジェクトを生成するため、メモリ消費が増加する可能性があります。

不変オブジェクトの特性を理解し、適切に使用することで、Longラッパークラスを効果的に活用できます。

よくある質問

Longとlongのどちらを使うべきか?

Longlongのどちらを使用するかは、用途によって異なります。

以下のポイントを考慮して選択してください。

  • longを使用する場合:
  • パフォーマンスが重要な場合。

longはプリミティブ型であり、メモリ消費が少なく、処理速度が速いです。

  • 数値演算が頻繁に行われる場合。

オートボクシングやアンボクシングのオーバーヘッドを避けることができます。

  • Longを使用する場合:
  • コレクションフレームワークを使用する場合。

コレクションはオブジェクトを扱うため、Longが必要です。

  • nullを扱う必要がある場合。

Longはオブジェクトであるため、nullを許容します。

Longラッパークラスはスレッドセーフですか?

Longラッパークラス自体は不変オブジェクトであるため、スレッドセーフです。

複数のスレッドから同時にアクセスされても、Longオブジェクトの状態が変わることはありません。

しかし、Longオブジェクトを変更する必要がある場合は、AtomicLongなどのスレッドセーフなクラスを使用することを検討してください。

AtomicLongは、スレッド間で安全に数値を更新するためのクラスです。

Longの最大値と最小値はどうやって取得するのか?

Longの最大値と最小値は、Longクラスの定数を使用して取得できます。

以下の定数を使用します。

  • 最大値: Long.MAX_VALUE
  • 例:long maxValue = Long.MAX_VALUE; // 最大値は9,223,372,036,854,775,807
  • 最小値: Long.MIN_VALUE
  • 例:long minValue = Long.MIN_VALUE; // 最小値は-9,223,372,036,854,775,808

これらの定数を使用することで、Longの範囲を簡単に確認することができます。

まとめ

この記事では、JavaのLongラッパークラスについて、その基本的な使い方や応用例、注意点を詳しく解説しました。

Longラッパークラスは、基本データ型longをオブジェクトとして扱うための便利なクラスであり、コレクションやマルチスレッド環境、データベースとの連携において重要な役割を果たします。

この記事を参考に、Longラッパークラスを活用して、より効率的で安全なJavaプログラミングに挑戦してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • 言語仕様 (16)
  • URLをコピーしました!
目次から探す