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ラッパークラスの概要
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をオブジェクトとして扱うことができます。
以下に、longとLongの主な違いを示します。
| 特徴 | long | Long |
|---|---|---|
| 型 | プリミティブ型 | オブジェクト型 |
| 初期値 | 0 | null |
| 使用例 | 数値演算 | コレクション |
オートボクシングとアンボクシング
Javaでは、基本データ型とその対応するラッパークラスの間で自動的に変換が行われる機能があります。
これをオートボクシングとアンボクシングと呼びます。
- オートボクシング: 基本データ型からラッパークラスへの自動変換。
- 例:
Long longObj = 10L; // long型の10LがLongオブジェクトに変換される - アンボクシング: ラッパークラスから基本データ型への自動変換。
- 例:
long num = longObj;// Longオブジェクトがlong型に変換される
これらの機能により、基本データ型とラッパークラスの間での変換が容易になり、コードの可読性が向上します。
Longラッパークラスの基本的な使い方
Longオブジェクトの生成
Longラッパークラスのオブジェクトを生成する方法はいくつかあります。
以下に代表的な方法を示します。
- コンストラクタを使用する方法:
Long longObj1 = new Long(100L);これは非推奨の方法で、Java 9以降では使用しないことが推奨されています。
- valueOfメソッドを使用する方法:
Long longObj2 = Long.valueOf(100L);この方法はキャッシュを利用するため、効率的です。
- オートボクシングを利用する方法:
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は-1resultが0の場合、aとbは等しい。resultが負の場合、aはbより小さい。resultが正の場合、aはbより大きい。
equalsメソッドの使い方
equalsメソッドは、2つのLongオブジェクトが等しいかどうかを判定します。
Long a = 100L;
Long b = 100L;
boolean isEqual = a.equals(b); // aとbは等しいので、isEqualはtrueequalsメソッドは、オブジェクトの値が等しい場合に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型の数値をコレクションに格納する際に役立ちます。
以下は、ArrayListにLongオブジェクトを格納する例です。
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この例では、ArrayListにLongオブジェクトを追加し、リスト内の各要素を出力しています。
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ラッパークラスを効果的に活用できます。
まとめ
この記事では、JavaのLongラッパークラスについて、その基本的な使い方や応用例、注意点を詳しく解説しました。
Longラッパークラスは、基本データ型longをオブジェクトとして扱うための便利なクラスであり、コレクションやマルチスレッド環境、データベースとの連携において重要な役割を果たします。
この記事を参考に、Longラッパークラスを活用して、より効率的で安全なJavaプログラミングに挑戦してみてください。