1. ホーム
  2. java

[解決済み] なぜ、Javaではいまだにプリミティブ型が使われているのでしょうか?

2022-04-21 12:28:41

質問

Java 5以降、プリミティブ型のボックス化/アンボックス化が行われ、以下のようになりました。 int がラップされて java.lang.Integer といった具合に。

最近、新しいJavaのプロジェクトをよく見かけますが、(その 間違いなく を使用している場合、少なくともバージョン 5 の JRE が必要です。 int ではなく java.lang.Integer に変換するためのヘルパーメソッドがいくつか用意されているので、後者を使うほうがずっと便利です。 long 値など。

なぜ、いくつかの 今も Javaではプリミティブ型を使っていますか?何か具体的な利点があるのでしょうか?

どのように解決するのですか?

ジョシュア・ブロッホの 効果的なJava 項目5: "不要なオブジェクトの作成を避ける"では、次のようなコード例を掲載しています。

public static void main(String[] args) {
    Long sum = 0L; // uses Long, not long
    for (long i = 0; i <= Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

で、実行に43秒かかります。Longをプリミティブに取り込むと6.8秒に...。プリミティブを使う理由がこれでわかると思います。

ネイティブな値の等価性がないのも気になるところです( .equals() と比べると、かなり冗長です。 == )

を biziclop に変更しました。

class Biziclop {

    public static void main(String[] args) {
        System.out.println(new Integer(5) == new Integer(5));
        System.out.println(new Integer(500) == new Integer(500));

        System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
        System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
    }
}

結果が出る。

false
false
true
false

<サブ EDIT なぜ(3)が返ってくるのか true を返し、(4)は false ?

2つの異なるオブジェクトだからです。ゼロに最も近い256個の整数 [-128; 127] はJVMによってキャッシュされているので、それらについては同じオブジェクトを返します。しかし、その範囲を超えるとキャッシュされないので、新しいオブジェクトが作成されます。さらに複雑なことに、JLSは以下のことを要求しています。 少なくとも 256個のフライウェイトがキャッシュされます。JVMの実装者は、彼らが望むなら、より多くを追加することができます。つまり、最も近い1024がキャッシュされ、それらのすべてが真を返すシステム上で実行することができます... #awkward