3秒でわかる
Javaで値そのものを直接持つ8つの基本型のこと。参照型と違って null を入れられず、速度とメモリ効率の面で有利になります。
もう少し詳しく
どういうものか
プリミティブ型は、変数の箱に値そのものが入るJavaの基本型です。byte short int long float double char boolean の8つがあり、これ以外はすべて参照型になります。参照型の変数がオブジェクトの置き場所を指す番号を持つのに対し、プリミティブ型の変数は数値や真偽値の実体を持ちます。だから null を入れることができず、初期値はフィールドなら 0 や false になります。
なぜ必要か
すべてをオブジェクトにすると、整数ひとつ足すたびにヒープ上の実体をたどる必要が出て、計算が遅くなります。ループを100万回まわす処理でこの差は無視できません。値を直接持つ型を用意することで、加算や比較をCPUの命令ひとつ分に近いコストで実行できます。
具体例
代入したときの挙動が参照型と決定的に違います。
int a = 10;
int b = a; // 値がコピーされる
b = 99;
System.out.println(a); // 10 のまま
int[] x = {10};
int[] y = x; // 配列の場所がコピーされる
y[0] = 99;
System.out.println(x[0]); // 99 に変わる
Integer boxed = 128;
Integer other = 128;
System.out.println(boxed == other); // false になりうる
System.out.println(boxed.equals(other)); // trueつまずきやすいところ
最後の == の例が典型的な罠です。Integer は参照型なので == は同じオブジェクトかどうかを見ます。Javaは小さい整数をキャッシュしているため127までは true になり、128から false に変わります。値を比べたいときは必ず equals を使います。もうひとつは int どうしの割り算で、5 / 2 は 2 になります。小数がほしいなら片方を double にします。
覚え方
箱に「値そのものが入る」のがプリミティブ型、「住所が入る」のが参照型です。コピーしたときに元が道連れになるかどうかで見分けられます。
似た用語との違い
| 語 | 内容 |
|---|---|
| プリミティブ型 | 値そのものを持つ8つの基本型 |
| 参照型 | オブジェクトの置き場所を持つ型 |
| ラッパークラス | プリミティブ型をオブジェクトとして包んだ型 |
配列は要素がプリミティブ型でも、配列そのものは参照型として扱われます。