社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Java プリミティブ型のメリットって

なんでしょうか。色んな意見がありそうですが。。

1. null を許容しない
例えば、プリミティブ型の int を返すメソッドで return null と書くとコンパイルエラーになる。
個人的には、そんなに嬉しいかと言われると微妙です。
そもそも、null 許容しないなら、return null なんて書かないと思います。

2. パフォーマンスがオブジェクト型より良い

  • オブジェクト型のデータはオブジェクトを生成しなければならない。
  • また、位置情報を使ってヒープ領域のデータを参照しなければならない。
  • これらは、プリミティブ型に比べてオーバーヘッドになり得る。

昔に比べて今はメモリの使用量に関して、そこまで深刻になるケースはないかもしれません。

ただ、以下を Integer でループするかと聞かれたら”いいえ”と答えます。

for (int i=0; i<100000; i++) {
}

3. GCガベージコレクション) の対象にならない
これは上のパフォーマンスと同じような意味になります。
プリミティブ型の変数はヒープから割り当てられず、代わりにスタック領域に割り当てられる。
オブジェクト型はヒープ領域から割り当てられるため、ガベージコレクションが必要になる。

4. Effective Java に "Avoid creating unnecessary objects" と書いてある
上の for ループの例と重複しますが、以下を実行すると40秒かかるが、プリミティブ型であれば10秒以内で処理される。

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

5. 数値の比較に == が使える
オブジェクト型の場合、.equals() を使えば比較は出来るので、特に問題はないです。
ただ、-128 から 127 までの値であれば、オブジェクト型でも == で比較が出来てしまうケースがあるややこしい一面があります。

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

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

こうやってみてみると、プリミティブ型が活躍しそうな(している)場面はありますね。