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

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


簡単なまとめ

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

プリミティブ型の特徴

4.2. Primitive Types and Values

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

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

// 非プリミティブ型の例
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が発生しないので品質向上にもつながります。
  • デメリット
    • ListやMapといったジェネリクスクラスの型パラメータにプリミティブ型を指定することはできません。
      指定する場合はラッパークラスを使います。
// 非プリミティブ型の例
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]

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

ラッパークラス

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

主な用途

  • ListやMapなどのジェネリクスクラスの型パラメータに、プリミティブ型の代わりに指定します。
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}

他には、それぞれのプリミティブ型の最小値・最大値や、便利なメソッドなんかもそろっています。

Integerについては当サイトでも使用例の記事を書いているので、そちらも参考にしていただけたら幸いです。

デフォルト値

4.12.5. Initial Values of Variables

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

public 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;

    public 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); // ''
        System.out.println(Integer.toString(charValue)); // 0

        System.out.println(floatValue); // 0.0
        System.out.println(doubleValue); //0.0
    }
}
final var defaultValue = new DefaultValue();
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

関連記事

ページの先頭へ