Javaのプリミティブ型について

プリミティブ型
nullだめ
メモリ使用量が決まっている
メソッドを持たない
参照型
メリット
メモリ使用量が減る
JVMのスタック領域に値を確保するため、GCの対象外になる。それゆえ高パフォーマンス。
==で比較可能
nullセーフ
デメリット
メソッドを持たない

プリミティブ型と参照型
Javaの変数型には大きく分けてプリミティブ型と参照型があります。
プリミティブ型を一言で言うと、プログラミング言語における基本の型です。
(primitiveは「原始的な」という意味の単語です)
具体的にはint, char, byteなどです。
プリミティブ型は、その型の変数が使用するメモリ量の上限が決まっています。
データ型 | bit |
---|---|
boolean | 1 |
byte | 8 |
char | 16 |
short | 16 |
int | 32 |
float | 32 |
long | 64 |
double | 64 |
一方で、参照型とは値自体を持たず、値への参照情報を保持する型です。
と言っても新人さんからすると「???」となるので、よくある具体例を示します。
例えば↓のようなSampleクラスがあったとして、
class Sample {
public int id;
}
Sample型変数s1, s2を以下のようにごにょごにょすると・・・
jshell> var s1 = new Sample();
s1 ==> Sample@675d3402
jshell> s1.id = 1
$8 ==> 1
jshell> var s2 = s1;
s2 ==> Sample@675d3402
jshell> s2.id = 2
$10 ==> 2
jshell> s1.id
$11 ==> 2
s2.idを2にすると、s1.idも1から2に変わってしまいます。
↑をよく見ると、s1もs2もSample@675d3402
という同じ場所を参照していますね。
つまり、s1, s2は値自体を持ってるのではなく、Sample@675d3402
という場所への参照情報を持っているだけということです。
より踏み込んだ言い方をすると、s1, s2はJVMのスタック領域に確保され、Sample@675d3402
はヒープ領域に確保されます。
参考:https://qiita.com/dung717/items/6552005a4fdccc893c43
プリミティブ型の特徴
プリミティブ型にはメリットがいくつかあります。
nullセーフ
プリミティブ型にはnullを代入することはできません。
ゆえに、プリミティブ型変数が原因でぬるぽが起きることはありません。
int a = null
などとしても、コンパイルエラーになります。
メモリ使用量をある程度予測しやすい
ちらっと前述しましたが、プリミティブ型は型によって使えるメモリ量が決まっています。
一方で参照型はクラスの構造によってメモリ量が増減するため、プリミティブ型に比べてメモリ使用量が予測しづらいです。
メモリ使用量を気にせずがむしゃらにコードを書いていると、いつかOut of Memoryになって先輩に泣きつくことになるので、この辺りは新人の頃から意識しておきたいところです。
==で比較可能
参照型変数を==で比較するな!というのは誰もが一度は言われる指摘だと思います。
ですが、プリミティブ型は参照ではなく値自体を変数が保持するため、==で比較可能です。
参考:https://qiita.com/dsk_datadog/items/1251e86d9d22507d309a