「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 項目 パッケージ化されたプリミティブ型よりもプリミティブ型を優先する

項目 パッケージ化されたプリミティブ型よりもプリミティブ型を優先する

2024 年 11 月 11 日に公開
ブラウズ:369

Item  Dê preferência aos tipos primitivos em vez dos tipos primitivos empacotados

プリミティブ型 vs.パックされたプリミティブ型

  • プリミティブ型: int、double、boolean など
  • パックされたプリミティブ型: Integer、Double、Boolean など
  • Java には、プリミティブ型と参照型 (オブジェクト) という二重の型システムがあります。
  • 各プリミティブ型には、対応するラッパー クラスがあります。

主な違い

  • アイデンティティ vs.価値:
    プリミティブ: これらにはアイデンティティがありません。同じ値を持つ 2 つのプリミティブは常に等しいです。
    Packaged: これらはオブジェクトであり、アイデンティティを持っています。 2 つのオブジェクトは同じ値を持つことができますが、異なる ID を持つことができます。

  • Null 値:
    Primitives: 常にデフォルト値があります (たとえば、int の場合は 0)。
    Packed: null の可能性があり、適切に処理されないと NullPointerException 例外が発生する可能性があります。

  • パフォーマンス:
    プリミティブ: 時間と空間の点でより効率的です。
    Packaged: 追加オブジェクトの作成によりオーバーヘッドが発生します。

プリミティブとパッケージを混合する際の一般的な問題

  • 1.値の比較ではなく同一性
  • == を使用してパッケージ化されたオブジェクトを比較する場合、値ではなくオブジェクト参照を比較します。これにより、予期しない結果が生じる可能性があります。

問題のある例:

Comparator naturalOrder = (i, j) -> (i 



問題: 比較 i == j は値ではなく参照を比較します。
間違った動作:naturalOrder.compare(new Integer(42), new Integer(42)) は 0 ではなく 1 を返します。

解決:
CompareTo メソッドまたは Integer.
クラスのユーティリティ メソッドを使用します。

Comparator naturalOrder = Integer::compare;

または、元のコンパレータを修正します:

Comparator naturalOrder = (iBoxed, jBoxed) -> {
    int i = iBoxed;
    int j = jBoxed;
    return (i 



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 



問題: 合計はパックされた Long です。各反復で、自動ボックス化/ボックス化解除が発生します。

影響: コードが大幅に遅くなり、メモリ使用量が過剰になります。
解決:
集中的な操作ではローカル変数にプリミティブ型を使用します。

Long sum = 0L;
for (long i = 0; i 



パッケージ化された型を使用する場合

  • コレクション: ジェネリック コレクション (リストなど) ではプリミティブ型を使用できません。
  • ジェネリック パラメータ: ジェネリック型はプリミティブ型 (ThreadLocal など) をサポートしません。
  • オブジェクトを必要とする API: 特定の API では、プリミティブ型ではなくオブジェクトが必要です。

グッドプラクティス

  • プリミティブ型を優先する: 簡素化と効率性を高めるために、可能な限りプリミティブ型を使用してください。
  • オートボックス化/ボックス化解除に注意してください: オートボックス化により冗長性は軽減されますが、微妙なエラーが発生する可能性があります。
  • ラップされた == との比較を避ける:equals() などのメソッドを使用するか、ラップされていない値を比較します。
  • Null のチェック: パッケージ化された型を使用する場合、型が null になり、NullPointerException が発生する可能性があることに注意してください。

まとめ
プリミティブ型:
よりシンプルかつ高速に。
null にすることはできません。
これらにはアイデンティティはありません (値のみ)。

パックされた型:
コレクションおよび汎用 API で使用する場合に必要です。
null にすることもできます。
これらはオブジェクト ID を持っています。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/giselecoder/item-61-de-preferencia-aos-tipos-primitivos-em-vez-dostipos-primitivos-empacotados-34fk?1 侵害がある場合は、 Study_golang@163 .comdelete に連絡してください
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3