Java : プリミティブ型 (基本データ型)

int や boolean, float といったプリミティブ型についてのまとめです。
デフォルト値や最小値・最大値、ラッパークラスなどについてご紹介します。


簡単なまとめ

デフォルト値 範囲 サイズ ラッパークラス
boolean false false / true - Boolean
byte (byte)0 -128 ~ 127 8ビット Byte
short (short)0 -32768 ~ 32767 16ビット Short
int 0 -2147483648 ~ 2147483647 32ビット Integer
long 0L -9223372036854775808 ~ 9223372036854775807 64ビット Long
char '\u0000' '\u0000' ~ '\uffff' (0 ~ 65535) 16ビット Character
float 0.0f 1.4E-45 ~ 3.4028235E38 32ビット(IEEE754浮動小数点数) Float
double 0.0d 4.9E-324 ~ 1.7976931348623157E308 64ビット(IEEE754浮動小数点数) Double

プリミティブ型の特徴

4.2. Primitive Types and Values

プリミティブ型の詳細な仕様が知りたいかたは、上記の公式言語仕様を参照することをおすすめします。
(ただし英語となります。残念ながら公式の日本語訳はなさそう)

1つめの特徴は Objectクラス を継承していない、ということです。
よって、Objectクラスの hashCodeequals といったメソッドは使えません。

// 非プリミティブ型の例
String str1 = "abc";
String str2 = "def";
System.out.println(str1.hashCode()); // 96354
System.out.println(str2.hashCode()); // 99333
System.out.println(str1.equals(str2)); // false

// プリミティブ型の例
int value1 = 1;
int value2 = 2;
value1.hashCode(); // コンパイルエラー
value1.equals(values2); // コンパイルエラー

2つめの特徴は、プリミティブ型の変数には null を代入できないことです。
null を代入しようとするとコンパイルエラーとなります。

// コンパイルOK
int a = 123;

// コンパイルエラー
int b = null;

もし変数に null を必要としない場合、プリミティブ型を使うことを強くおすすめします。

  • メリット
    • nullチェックが必要ありません。
      チェック不要なので単純にコード量が減り(コーディング速度向上)、NullPointerException が発生しないので品質向上にもつながります。
  • デメリット
    • ListMap といった、ジェネリクスクラスの型パラメータにプリミティブ型を指定することはできません。
      指定する場合はラッパークラスを使います。
// 非プリミティブ型の例
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
System.out.println(list); // [a, b]

// プリミティブ型の例
List<int> list2 = new ArrayList<>(); // コンパイルエラー

// ラッパークラスの例
List<Integer> list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(null); // nullも代入可能なので注意
System.out.println(list2); // [1, 2, null]

// 配列はプリミティブ型 OK
int[] array = {1, 2, 3};
System.out.println(Arrays.toString(array)); // [1, 2, 3]

基本的にはプリミティブ型を使い、どうしてもダメなときだけラッパークラスを使う、という方針でよいかと思います。


ラッパークラス

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

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

主な用途

  • ListMap などのジェネリクスクラスの型パラメータに、プリミティブ型の代わりに指定します。
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(null); // nullも代入可能なので注意
System.out.println(list); // [1, 2, null]

Map<Integer, Boolean> map = new HashMap<>();
map.put(1, true);
map.put(2, false);
map.put(3, null); // nullも代入可能なので注意
System.out.println(map); // {1=true, 2=false, 3=null}

他には、それぞれのプリミティブ型の最小値・最大値が定義されていたり、便利なメソッドなんかもそろっています。
APIの詳細については、上記の表にあるリンク先をご参照ください。

デフォルト値

4.12.5. Initial Values of Variables

言語仕様では 4.12.5 に規定があります。
実際にコード例で見てみましょう。

class DefaultValue {

    private boolean booleanValue;
    private byte byteValue;
    private short shortValue;
    private int intValue;
    private long longValue;
    private char charValue;
    private float floatValue;
    private double doubleValue;

    void print() {
        System.out.println(booleanValue); // false
        System.out.println(byteValue); // 0
        System.out.println(shortValue); // 0
        System.out.println(intValue); // 0
        System.out.println(longValue); // 0

        System.out.println(charValue == '\u0000'); // true

        System.out.println(floatValue); // 0.0
        System.out.println(doubleValue); // 0.0
    }
}

new DefaultValue().print();

最小値・最大値

言語仕様にも記載がありますが、ラッパークラスでも定義されています。

System.out.println(Byte.MIN_VALUE); // -128
System.out.println(Byte.MAX_VALUE); // 127

System.out.println(Short.MIN_VALUE); // -32768
System.out.println(Short.MAX_VALUE); // 32767

System.out.println(Integer.MIN_VALUE); // -2147483648
System.out.println(Integer.MAX_VALUE); // 2147483647

System.out.println(Long.MIN_VALUE); // -9223372036854775808
System.out.println(Long.MAX_VALUE); // 9223372036854775807

System.out.println(Integer.toString(Character.MIN_VALUE)); // 0
System.out.println(Integer.toString(Character.MAX_VALUE)); // 65535

System.out.println(Float.MIN_VALUE); // 1.4E-45
System.out.println(Float.MAX_VALUE); // 3.4028235E38

System.out.println(Double.MIN_VALUE); // 4.9E-324
System.out.println(Double.MAX_VALUE); // 1.7976931348623157E308

関連記事

ページの先頭へ