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 }
こうやってみてみると、プリミティブ型が活躍しそうな(している)場面はありますね。