Closed2

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

tttoltttol

https://www.fenet.jp/infla/column/technology/javaにおけるプリミティブ型とは?プリミティブ型/

プリミティブ型
nullだめ
メモリ使用量が決まっている
メソッドを持たない

参照型

メリット
メモリ使用量が減る
JVMのスタック領域に値を確保するため、GCの対象外になる。それゆえ高パフォーマンス。
==で比較可能
nullセーフ

デメリット
メソッドを持たない

tttoltttol

プリミティブ型と参照型

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

JVMのスタック領域に値を確保するためガベージコレクションの対象外になり、パフォーマンスが高い

このスクラップは2024/07/28にクローズされました