Java でのオートボックス化とボックス化解除

PHPz
リリース: 2024-08-30 16:06:21
オリジナル
721 人が閲覧しました

オートボックス化は、プリミティブ型とそれに対応するラッパー クラス オブジェクト間の Java コンパイラーの自動変換です。つまり、int から Integer、double から Double への変換などです。アンボックス化は、ラッパー クラス オブジェクトから同等のプリミティブへの自動変換です。整数から整数へ。この機能は Java バージョン 1.5 で導入されました。

Java ではオートボックス化とボックス化解除はどのように機能しますか?

コンパイラは valueOf() メソッドを使用して、プリミティブを対応するラッパー オブジェクト (つまり、オートボックス化) に内部的に変換します。逆の場合は、アンボックス化のパラダイムと同様に、intValue()、doubleValue() などを使用します。

無料ソフトウェア開発コースを始めましょう

Web 開発、プログラミング言語、ソフトウェア テスト、その他

Java のプリミティブ型とラッパー クラスのマッピングは次のとおりです。

Primitive type Wrapper class
boolean Boolean
byte Byte
char Character
float Float
int Integer
long Long
short Short
double Double

整数の ArrayList を取得し、アンボックス化の概念を利用してみましょう。

import java.util.ArrayList;
public class MyClass {
public static void main(String args[]) <em>{</em>
ArrayList<Integer> intlist = new ArrayList<Integer>();
//wrapper Integer objects being added here
intlist.add(1);
interest.add(2);
//auto-unboxing is happening here
int x = intlist.get(0);
System.out.println(x);
}
}
ログイン後にコピー

したがって、上記の例では、x に値を追加しているときに、x がプリミティブであるように見えることがわかります。その結果、割り当ての完了中に、ここでボックス化解除が自動的に行われます。

public class MyClass {
public static void main(String args[]) {
Integer sum =0;
for(int i=0;i<10;i++)
{
sum = sum + i;
}
System.out.println(sum);
}
}
ログイン後にコピー
  • 上では、この文脈における 2 番目の例を示し、典型的なシナリオが示されています。 Java でのオブジェクト作成に慣れている場合は、「Integer sum =0」がオブジェクトを宣言していることがわかります。ループ内で計算を行うと、プリミティブ値「i」がオブジェクトに追加されていることがわかります。ラッパー「合計」
  • したがって、「+」演算子はプリミティブのみに作用するため、最初にラッパーからプリミティブへの変換が発生することがわかります。したがって、オブジェクトのボックス化解除が最初に行われます。その後、計算が行われ、その後、オブジェクトのオートボックス化が再び行われます。そして、その値が変数「sum」に代入されます。
  • これにより、多くの中間 Integer オブジェクトが作成されて破棄され (後でガベージ コレクションされるため)、JVM に不要なオーバーヘッドが発生し、速度低下の原因となります。したがって、このようなロジックは慎重に取り扱う必要があります。
  • この状況が一般的な認識とどのように異なるかを見てみましょう。自動ボックス化とボックス化解除を理解するために、コーディングを使用します。

以下にあるスニペットを考えてみましょう。これの出力は何になりますか?

public class Main
{
public static void main(String[] args) {
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
}
}
ログイン後にコピー
  • 「true」と言っている場合、出力も「false」であるため、「false」になります。 -128 から 127 までの整数範囲を比較できるため、この範囲外の値はボックス化解除する必要があります。
  • 結果として、上記の整数の intValue() を比較する必要があります。現時点では、コンパイラーは valueOf() プロパティを使用してこれを実行します。
  • これが上記の範囲内にある場合、最初に比較のために整数リテラル プールを参照するため、上記のコードはそのまま「true」を返します。
public class Main
{
public static void main(String[] args) {
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
}
}
ログイン後にコピー

リテラル プールには 100 が存在するため、これは「true」値として評価されます。

メソッドのオーバーロードを使用した Java でのオートボックス化とボックス化解除

  • オートボックス化とアンボックス化にメソッドのオーバーロードをタグ付けする前に、読者がメソッドのオーバーロードの概念を理解していることを前提としています。ここではほんの少しの洞察のみを提供します。詳細については、Oracle のドキュメントを参照してください。
  • メソッドのオーバーロードは、同じメソッド名と異なる数の入力引数、同じ名前の異なるデータ型の変数などを使用して、計算メソッドの複数のバリアントを提示するプロセスです。
  • よりよく理解するために例を挙げてみましょう。出力イメージは以下に表示されます。
public class Main
{
public static void main(String[] args) {
Overload obj =  new Overload();
int i =5;
obj.printval(5);
Integer m = i;
obj.printval(m);
}
}
class Overload
{
public void printval(int i)
{
System.out.println("printing the unboxed value "+ i);
}
public void printval(Integer i)
{
System.out.println("printing the autoboxed value "+ i);
}
}
ログイン後にコピー

出力:

Java でのオートボックス化とボックス化解除

注: 上記のプログラムを任意の IDE で実行して、上記の出力を取得できます。
  • 結果として、上記の動作は、オートボックス化手法が概念のオーバーロードに有用であり、コーディング時には注意して使用する必要があることを明確に示しています。

Java でのオートボックス化とアンボックス化の利点

  • コンパイラは、適切な変換を自動的に実行します。
  • 開発者が記述するコードが少なくなるため、よりクリーンなコードが作成されます。
  • 手動で型キャスト式を行う必要はありません。

結論

オートボックス化とアンボックス化のユースケースと、この概念がいかに暗黙的であるか、そしてその長所と短所について説明しました。コーディング時には注意して使用する必要があります。そうしないと、不必要な計算変換オーバーヘッドが追加される可能性があります。したがって、過度のガベージ コレクションのオーバーヘッドや一時オブジェクトの作成を避けるために、変換はプリミティブで実行する必要があります。また、Java のオーバーロード概念を使用したオートボックス化の使用例も確認しました。これに加えて、さらにいくつかの制約を確認できます。

以上がJava でのオートボックス化とボックス化解除の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート