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 |
プリミティブ型の特徴
プリミティブ型の詳細な仕様が知りたいかたは、上記の公式言語仕様を参照することをおすすめします。
(ただし英語となります。残念ながら公式の日本語訳はなさそう)
1つめの特徴は Objectクラス を継承していない、ということです。
よって、Objectクラスの 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 が発生しないので品質向上にもつながります。
- nullチェックが必要ありません。
- デメリット
// 非プリミティブ型の例
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 |
主な用途
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 に規定があります。
実際にコード例で見てみましょう。
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