Javaのプリミティブ型と参照型の違いとは?一覧と使い分けを初心者向けに地方フルリモートエンジニアが実務視点で解説

Java基礎

Javaのデータ型を学ぶと必ず出てくる「プリミティブ型」と「参照型」。この2つの違いを理解することは、Javaプログラミングの基礎を固める上でとても重要です。この記事では、Javaプリミティブ型の一覧と参照型との違いを、メモリの仕組みを含めて初心者向けにわかりやすく解説します。

生徒
プリミティブ型と参照型ってどう違うんですか?Stringはどっちですか?
先生
良い質問!プリミティブ型は「値そのもの」を保存し、参照型は「データの場所」を保存するんだ。Stringは参照型だよ。詳しく説明するね!

プリミティブ型とは?

プリミティブ型(Primitive Type)は、Javaに最初から用意されている基本データ型です。「原始的」という意味の名前の通り、最もシンプルなデータ型で、値そのものを直接変数に格納するという特徴があります。

Javaのデータ型一覧!int・Stringなど基本の型を初心者向けに地方フルリモートエンジニアが実務視点で解説
Javaで変数を使うとき、必ず指定しなければならないのが「データ型」です。データ型は、変数にどんな種類のデータを入れるかを決める重要な要素。この記事では、Javaのデータ型の種類を一覧で紹介し、intやStringなどの基本的な型を初心者向...

プリミティブ型の特徴

プリミティブ型の特徴

  • 全部で8種類のみ(Javaで定義済み)
  • 値そのものを変数に直接格納する
  • 小文字で始まる(int, double, boolean など)
  • メソッドを持たない(シンプルなデータ)
  • nullを代入できない

プリミティブ型一覧(全8種類)

Javaのプリミティブ型は8種類あり、用途によって分類されています。

整数型(4種類)

型名 サイズ 最小値 最大値
byte 8ビット(1バイト) -128 127
short 16ビット(2バイト) -32,768 32,767
int 32ビット(4バイト) 約-21億 約21億
long 64ビット(8バイト) 約-922京 約922京

intが最もよく使われます!

// 整数型の例
byte b = 100;
short s = 30000;
int i = 2000000000;
long l = 9000000000L;  // Lを付ける

浮動小数点型(2種類)

型名 サイズ 精度 用途
float 32ビット(4バイト) 約7桁 メモリ節約時
double 64ビット(8バイト) 約15桁 通常の小数計算

doubleが最もよく使われます!

// 浮動小数点型の例
float f = 3.14f;      // fを付ける
double d = 3.141592653589793;

文字型(1種類)

型名 サイズ 格納できる値 表記
char 16ビット(2バイト) 1文字(Unicode) シングルクォーテーション
// 文字型の例
char c1 = 'A';
char c2 = 'あ';
char c3 = '\u0041';  // Unicodeで'A'

論理型(1種類)

型名 サイズ 格納できる値 用途
boolean 1ビット true / false 条件分岐
// 論理型の例
boolean isJavaFun = true;
boolean isRaining = false;

参照型とは?

参照型(Reference Type)は、プリミティブ型以外のすべてのデータ型です。値そのものではなく、データが格納されているメモリ上の「場所(アドレス)」を保存するという特徴があります。

参照型の特徴

参照型の特徴

  • プリミティブ型以外のすべての型(無限にある)
  • データの場所(参照)を変数に格納する
  • 大文字で始まる(String, Integer, ArrayList など)
  • メソッドを持つ(機能が豊富)
  • nullを代入できる

代表的な参照型

// 参照型の例
String name = "山田太郎";           // 文字列
Integer number = 100;              // Integerラッパークラス
int[] scores = {80, 90, 100};      // 配列
ArrayList<String> list = new ArrayList<>();  // リスト
生徒
「参照」って、データの場所を指すってことですか?
先生
その通り!「この住所に行けばデータがあるよ」という情報を持っているイメージだね。メモリの仕組みで詳しく説明するよ。

プリミティブ型と参照型の違い

2つの型の違いを様々な観点から比較してみましょう。

比較表

項目 プリミティブ型 参照型
種類 8種類のみ 無限(自作も可能)
格納するもの 値そのもの 参照(アドレス)
nullの代入 不可 可能
メソッド なし あり
名前の規則 小文字で始まる 大文字で始まる
デフォルト値 0, 0.0, false など null

メモリの違いを図解で理解

プリミティブ型と参照型では、メモリへの格納方法が異なります。

プリミティブ型のメモリイメージ

int age = 25;

┌─────────────────┐
│  変数: age      │
│  値: 25         │  ← 値そのものが入っている
└─────────────────┘

参照型のメモリイメージ

String name = "山田";

┌─────────────────┐     ┌─────────────────┐
│  変数: name     │ ──→ │  実際のデータ   │
│  参照: @100     │     │  "山田"         │
└─────────────────┘     └─────────────────┘
    スタック領域            ヒープ領域

値のコピーの違い

この違いは、変数を別の変数にコピーしたときに顕著に現れます。

プリミティブ型のコピー

public class PrimitiveCopy {
    public static void main(String[] args) {
        int a = 10;
        int b = a;  // 値がコピーされる
        
        b = 20;     // bを変更
        
        System.out.println("a = " + a);  // a = 10(変わらない)
        System.out.println("b = " + b);  // b = 20
    }
}

実行結果:

a = 10
b = 20

プリミティブ型では、値そのものがコピーされるため、bを変更してもaは影響を受けません。

参照型のコピー

public class ReferenceCopy {
    public static void main(String[] args) {
        int[] arrayA = {1, 2, 3};
        int[] arrayB = arrayA;  // 参照がコピーされる
        
        arrayB[0] = 100;        // arrayBの要素を変更
        
        System.out.println("arrayA[0] = " + arrayA[0]);  // 100(変わる!)
        System.out.println("arrayB[0] = " + arrayB[0]);  // 100
    }
}

実行結果:

arrayA[0] = 100
arrayB[0] = 100
生徒
えっ、arrayAも変わっちゃった!なんでですか?
先生
参照型は「同じデータの場所」をコピーするから、arrayAとarrayBは同じ配列を指しているんだ。だから片方を変えると、もう片方も変わるように見えるんだよ。

重要ポイント

参照型の変数をコピーすると、同じデータを指す変数が2つできます。片方を変更すると、もう片方にも影響します。これは初心者がよく混乱するポイントです!

ラッパークラス:プリミティブ型を参照型として使う

プリミティブ型には、それぞれ対応するラッパークラス(参照型)があります。

プリミティブ型 ラッパークラス
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

ラッパークラスの使い方

// プリミティブ型
int primitiveInt = 100;

// ラッパークラス
Integer wrapperInt = 100;  // オートボクシング

// ラッパークラスのメソッドを使う
String str = wrapperInt.toString();  // "100"
int parsed = Integer.parseInt("200"); // 文字列→数値変換

いつラッパークラスを使う?

ラッパークラスを使う場面

  • コレクション(ArrayList等)に格納するとき
  • nullを許容したいとき
  • メソッド(parseInt等)を使いたいとき

プリミティブ型を使う場面

  • 単純な計算や比較
  • パフォーマンスを重視するとき
  • 基本的にはこちらを優先

よくある間違いと対処法

間違い①: プリミティブ型にnullを代入

NG: プリミティブ型にnullを代入
int number = null;
// エラー: プリミティブ型にnullは代入できない
OK: ラッパークラスを使用する
Integer number = null;
// ラッパークラスならnullを代入可能

間違い②: 参照型の比較に==を使う

NG: 参照型の比較に==を使う
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);
// false(参照が異なる)
OK: equalsメソッドを使う
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2));
// true(値が同じ)
先生
参照型の「値の比較」にはequals()メソッドを使おう!==は「同じオブジェクトか」を比較するから、結果が違うことがあるよ。

まとめ

この記事では、Javaプリミティブ型と参照型の違いについて解説しました。

この記事のポイント

  • プリミティブ型は8種類で、値そのものを格納する
  • 参照型はデータの場所(参照)を格納する
  • プリミティブ型は小文字、参照型は大文字で始まる
  • プリミティブ型はnullを代入できない
  • 参照型のコピーは同じデータを指すので注意
  • 各プリミティブ型には対応するラッパークラスがある
生徒
プリミティブ型と参照型の違いがよくわかりました!メモリの仕組みも理解できて嬉しいです!
先生
基本的にはint、double、booleanを使って、文字列はString。これだけ覚えておけば大丈夫!実際にコードを書いて動かしてみよう!

プリミティブ型と参照型の違いを理解することで、Javaプログラミングの基礎がしっかり身につきます。特に参照型の「コピーの挙動」は重要なので、サンプルコードを実行して体験してみてください!

運営者
最初は8種類もあって絶望しましたが、実務ではint、String、booleanの3つで8割は書けます。まずは基本から。