プリミティブ型 vs.パッケージ化されたプリミティブ型
主な違い
アイデンティティ vs.値:
プリミティブ: これらにはアイデンティティがありません。同じ値を持つ 2 つのプリミティブは常に等しいです。
パッケージ化: これらはオブジェクトであり、アイデンティティを持っています。 2 つのオブジェクトは同じ値を持つことができますが、異なる ID を持つことができます。
Null 値:
プリミティブ: 常にデフォルト値があります (例: int の場合は 0)。
Packaged: null の可能性があり、適切に処理されないと NullPointerException 例外が発生する可能性があります。
パフォーマンス:
プリミティブ: 時間と空間の点でより効率的です。
パッケージ化: 追加オブジェクトの作成によりオーバーヘッドが発生します。
プリミティブとパッケージを混合する際の一般的な問題
問題のある例:
Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);
問題: i == j 比較は、値ではなく参照を比較します。
間違った動作:naturalOrder.compare(new Integer(42), new Integer(42)) は 0 ではなく 1 を返します。
解決策:
CompareTo メソッドまたは Integer クラスのユーティリティ メソッドを使用します。
Comparator<Integer> naturalOrder = Integer::compare;
または、元のコンパレータを修正します:
Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> { int i = iBoxed; int j = jBoxed; return (i < j) ? -1 : ((i == j) ? 0 : 1); };
2.自動アンボックス化と NullPointerException
null の可能性があるパック型を使用する場合、オブジェクトが null の場合、自動アンボックス化により例外がスローされる可能性があります。
問題のある例:
Integer i = null; if (i == 42) { System.out.println("Inacreditável"); }
問題: i は null です。 42 と比較すると、null 自動アンボックス化が発生し、NullPointerException が発生します。
解決策: 可能な場合はプリミティブ型を使用します。
int i = 0; if (i == 42) { System.out.println("Inacreditável"); }
3.自動ボクシング/ボクシング解除によるパフォーマンスの低下
集中的な操作でラップされた型を不用意に使用すると、オートボクシングや不要なオブジェクトの作成によりパフォーマンスが低下する可能性があります。
問題のある例:
Long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum);
問題: sum はパックされた Long です。各反復で、自動ボックス化/ボックス化解除が発生します。
影響: コードが大幅に遅くなり、メモリ使用量が過剰になります。
解決策:
集中的な操作ではローカル変数にプリミティブ型を使用します。
long sum = 0L; for (long i = 0; i <= Integer.MAX_VALUE; i++) { sum += i; } System.out.println(sum);
パッケージ化された型を使用する場合
グッドプラクティス
概要
プリミティブ型:
よりシンプルかつ高速に。
null にすることはできません。
これらにはアイデンティティはありません (価値のみ)。
パッケージ化されたタイプ:
コレクションおよび汎用 API で使用する場合に必要です。
null にすることもできます。
これらはオブジェクトのアイデンティティを持っています。
以上が項目 パッケージ化されたプリミティブ型よりもプリミティブ型を優先するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。