ホームページ  >  記事  >  Java  >  項目 パッケージ化されたプリミティブ型よりもプリミティブ型を優先する

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-10 08:09:02495ブラウズ

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

プリミティブ型 vs.パッケージ化されたプリミティブ型

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

主な違い

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

  • Null 値:
    プリミティブ: 常にデフォルト値があります (例: int の場合は 0)。
    Packaged: null の可能性があり、適切に処理されないと NullPointerException 例外が発生する可能性があります。

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

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

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

問題のある例:

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);

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

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

グッドプラクティス

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

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

パッケージ化されたタイプ:
コレクションおよび汎用 API で使用する場合に必要です。
null にすることもできます。
これらはオブジェクトのアイデンティティを持っています。

以上が項目 パッケージ化されたプリミティブ型よりもプリミティブ型を優先するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。