オートボクシングとアンボクシング
自動変換の規則を学びます
「オートボクシングとアンボクシング」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
自動変換
オートボクシングとは、Javaがプリミティブ型をラッパーオブジェクトへ自動的に変換することです。アンボクシングはその逆で、ラッパーをプリミティブ型に戻します。
これは暗黙的に行われるため、手動で変換メソッドを呼び出さなくても、2つの世界を混在させられます。
ボクシングの動作
intをInteger型の変数に代入すると、オートボクシングが発生します。コンパイラーがInteger.valueOfの呼び出しを自動的に挿入します。
public class Main {
public static void main(String[] args) {
int primitive = 42;
Integer boxed = primitive;
System.out.println(boxed);
}
}アンボクシングの動作
Integerをint型の変数に代入すると、アンボクシングが発生します。コンパイラーが内部でintValueの呼び出しを自動的に挿入します。
public class Main {
public static void main(String[] args) {
Integer boxed = 99;
int primitive = boxed;
System.out.println(primitive);
}
}コレクションでのボクシング
オートボクシングを最もよく目にするのは、プリミティブ型をコレクションに追加するときです。list.add(5)と書くと、Javaが5を自動的にIntegerへボクシングします。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>();
nums.add(1);
nums.add(2);
int first = nums.get(0);
System.out.println(first);
}
}算術演算ではアンボクシングされます
ラッパーオブジェクトに算術演算子を使うと、Javaはまずそれらをプリミティブ型にアンボクシングしてから計算し、その後、結果を再びボクシングすることがあります。
以下では、2つのInteger値が、それぞれアンボクシングされてから加算されます。
public class Main {
public static void main(String[] args) {
Integer a = 10;
Integer b = 32;
int sum = a + b;
System.out.println(sum);
}
}プリミティブ型とラッパーの混在
式の中では、プリミティブ型とラッパーを自由に混在させられます。計算中はJavaがラッパーをアンボクシングするため、両辺がプリミティブ型になります。
public class Main {
public static void main(String[] args) {
Integer wrapped = 7;
int raw = 3;
int product = wrapped * raw;
System.out.println(product);
}
}メソッド呼び出しでのボクシング
オートボクシングはメソッドの引数にも適用されます。Objectまたはラッパーを想定するメソッドには、プリミティブ型を渡すことができ、Javaが渡す際にボクシングします。
public class Main {
static void show(Object value) {
System.out.println("Got: " + value);
}
public static void main(String[] args) {
show(123);
show(true);
}
}隠れたコスト
オートボクシングは便利ですが、無料ではありません。ボクシングのたびにオブジェクトが作成されるため、処理量の多いループでは短時間しか使われないオブジェクトが何百万個も作られることがあります。
パフォーマンスが重要な数値計算のループでは、ラッパーではなくプリミティブ型を直接扱ってください。
public class Main {
public static void main(String[] args) {
long total = 0;
for (int i = 0; i < 5; i++) {
total += i;
}
System.out.println(total);
}
}valueOfとnewの違い
オートボクシングではInteger.valueOfが使用され、-128から127までの小さい値がキャッシュされます。new Integer(...)を呼び出すと常に新しいオブジェクトが作成されますが、現在は非推奨です。
オートボクシングに任せることをお勧めします。
public class Main {
public static void main(String[] args) {
Integer cached = Integer.valueOf(50);
System.out.println(cached);
}
}三項演算子とボクシング
注意が必要なルールがあります。三項演算子の式で、一方の分岐がプリミティブ型、もう一方がラッパーの場合、Javaは両方を共通のプリミティブ型にアンボクシングすることがあります。
通常は安全ですが、予期しない変換が発生する可能性があることに注意してください。
public class Main {
public static void main(String[] args) {
boolean flag = true;
Integer result = flag ? 1 : 2;
System.out.println(result);
}
}役立つ場面
オートボクシングは、プリミティブ型とジェネリクスやコレクションを混在させるコードを読みやすくするために存在します。適切に使えばコードの煩雑さを減らせますが、ホットループで無秩序に使うとパフォーマンスが低下します。
簡単な確認
オートボクシングのルールについての理解度を確認しましょう。
まとめ
オートボクシングとアンボクシングの仕組みについて学びました。
- オートボクシングは、
valueOfを使ってプリミティブ型をラッパーに変換します - アンボクシングは、
intValueのようなメソッドを使ってラッパーをプリミティブ型に戻します - 代入、コレクション、算術演算、メソッド呼び出しで発生します
- 便利ですがオブジェクトを作成するため、ホットループでは避けてください
よくある質問
「オートボクシングとアンボクシング」レッスンは無料ですか?
はい。「オートボクシングとアンボクシング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「オートボクシングとアンボクシング」で何を学びますか?
自動変換の規則を学びます ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「オートボクシングとアンボクシング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- プリミティブ型とラッパー型
- オートボクシングとアンボクシング
- パースとvalueOf
- オートボクシングの落とし穴