この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:11
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: データ型
SEOタイトル: Java データ型完全ガイド — プリミティブと参照型

この記事の要点
  • Java のデータ型はプリミティブ型 8 種 (byte/short/int/long/float/double/boolean/char) と参照型 (String/配列/クラス/interface) に大別
  • プリミティブ型はスタックに値そのものを格納、参照型はヒープ上のオブジェクトへの参照をスタックに格納
  • autoboxingint ⇔ Integer が自動変換される。Long.parseLong("123") など wrapper クラスのパース
  • キャスト: (int) 3.14 は明示キャスト必須、int → long は暗黙変換 OK
  • Java 10+ の var でローカル変数の型推論が可能。文字列は String (不変) と StringBuilder (可変) を使い分ける

プリミティブ型 8 種

Java のプリミティブ型は仕様でサイズと範囲が固定されています。OS / CPU に依存しないのが特徴です。

サイズ範囲デフォルト値用途
byte8 bit-128 ~ 1270バイナリ・ファイル I/O
short16 bit-32768 ~ 327670あまり使われない
int32 bit約 -21億 ~ 21億0整数の基本
long64 bit約 ±9.2×10180LID / 時刻 (epoch ms)
float32 bit約 6-7 桁精度0.0f軽量浮動小数
double64 bit約 15-16 桁精度0.0d浮動小数の基本
boolean1 bit (JVM 内部実装は 8/32 bit)true / falsefalse真偽
char16 bitUTF-16 1 単位1 文字
int    n = 100;
long   id = 9_999_999_999L;   // 末尾 L 必須
double pi = 3.14159265358979;
float  f = 1.5f;              // 末尾 f 必須
char   c = 'あ';              // シングルクォート
boolean ok = true;

// アンダースコア区切り (Java 7+)
int million = 1_000_000;
long card   = 1234_5678_9012_3456L;

参照型

プリミティブ以外はすべて参照型です。new でヒープに確保され、変数にはそのアドレスが入ります。null 代入が可能です。

// クラス
String s = "Hello";          // 文字列リテラルは内部的に String オブジェクト
String t = new String("Hi"); // 明示的に new も可(非推奨)

// 配列も参照型
int[] arr = {1, 2, 3};
String[] names = new String[10];

// インターフェース型変数(実体は実装クラス)
List list = new ArrayList<>();

// null 代入可能
String u = null;

wrapper クラスと autoboxing

各プリミティブ型には対応するラッパークラスがあります。コレクションやジェネリクスでプリミティブを扱うために必要です。

プリミティブラッパーパース
intIntegerInteger.parseInt("123")
longLongLong.parseLong("123")
doubleDoubleDouble.parseDouble("3.14")
booleanBooleanBoolean.parseBoolean("true")
charCharacter
// autoboxing: int → Integer
Integer i = 100;          // 内部的に Integer.valueOf(100)
List list = new ArrayList<>();
list.add(1);              // int → Integer 自動変換

// unboxing: Integer → int
int n = i;                // 内部的に i.intValue()

// 文字列 ⇔ 数値
int    x = Integer.parseInt("123");
long   y = Long.parseLong("9999999999");
double z = Double.parseDouble("3.14");
String s = String.valueOf(123);   // "123"

型変換 (キャスト)

大きい型 → 小さい型は明示キャストが必要で、情報損失の可能性があります。小さい型 → 大きい型は暗黙変換されます。

// 暗黙変換 (widening)
int   n = 100;
long  l = n;           // OK
double d = n;          // OK

// 明示キャスト (narrowing)
double pi = 3.14;
int    i = (int) pi;   // 3(小数切り捨て)
long   big = 9_999_999_999L;
int    small = (int) big;  // オーバーフロー注意

// オブジェクトのキャスト
Object obj = "Hello";
String s = (String) obj;

// instanceof で安全に判定 (Java 16+ パターンマッチング)
if (obj instanceof String str) {
    System.out.println(str.length());
}

var による型推論 (Java 10+)

// ローカル変数の型推論
var list = new ArrayList();     // List
var map  = new HashMap();
var n    = 100;                          // int
var s    = "Hello";                      // String

// for ループでも使える
for (var i = 0; i < 10; i++) { ... }

// 制限事項
var x;                  // ❌ 初期値必須
var arr = {1, 2, 3};    // ❌ 配列初期化子だけだと不可
var f = (int x) -> x;   // ❌ ラムダ単独不可

文字列: String と StringBuilder

String は不変 (immutable)。文字列を連結すると毎回新しいオブジェクトが生成されます。ループ内では StringBuilder を使うのが定石です。

// ❌ ループ内 + は遅い(毎回 String 生成)
String s = "";
for (int i = 0; i < 10000; i++) s += i;

// ✅ StringBuilder(可変)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) sb.append(i);
String result = sb.toString();

// 短い連結なら + でも OK(コンパイラが StringBuilder 化)
String hello = "Hello, " + name + "!";

// 文字列の比較は equals
"abc".equals(s);         // ✅
s == "abc";              // ❌ 参照比較

BigDecimal: 金額計算の必須型

double では 0.1 + 0.2 != 0.3 となる丸め誤差があります。金額計算は必ず BigDecimalを使います。

import java.math.BigDecimal;

// ❌ double は誤差
System.out.println(0.1 + 0.2);  // 0.30000000000000004

// ✅ BigDecimal(文字列で初期化)
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b));   // 0.3

// 比較は compareTo
a.compareTo(b);                 // -1 / 0 / 1

FAQ

Q: intInteger どちらを使うべき?
A: 基本は int。コレクションに入れる、null 可能、ジェネリクスを使う場合のみ Integer

Q: String+ は本当に遅い?
A: 1 回や 2 回なら問題なし(コンパイラが StringBuilder 化)。ループ内+= は新規 String を毎回作るため激遅。

Q: char で絵文字を扱える?
A: BMP 外(U+10000 以上、絵文字の多く)は 16 bit に収まらずサロゲートペアで 2 文字扱い。String.codePoints() で正しく扱う。