intとIntegerの違い
簡単に言えば:
- intはプリミティブ型(primitive type)、Integerは参照型(reference type)
- Integerはintのラッパークラス(wrapper class)
プリミティブ型とは
Javaには8種類の組込み型(built-in data types)があり、プリミティブ型(primitive type)と呼ばれます。
また、各プリミティブ型には対応しているラッパークラスがあります。
型 | 説明 | 範囲 | 例 | ラッパークラス |
---|---|---|---|---|
boolean | 真偽値 | true / false | true | java.lang.Boolean |
byte | 8bit整数値 | -128 ~ 127 | 123 | java.lang.Byte |
short | 16bit整数値 | -32768 ~ 32767 | 123 | java.lang.Short |
int | 32bit整数値 | -2147483648 ~ 2147483647 | 123 | java.lang.Integer |
long | 64bit整数値 | $-2^{63} \sim 2^{63}-1 $ | 123L | java.lang.Long |
float | 32bit浮動小数点値 | 絶対値範囲 $2^{-149} \sim (2-2^{-23})*2^{127}$ | 123.45f | java.lang.Float |
double | 64bit浮動小数点値 | 絶対値範囲 $2^{-1024} \sim (2-2^{-52})*2^{1023}$ | 123.45 | java.lang.Double |
char | 16bit Unicode値 | \u0000 ~ \uffff $\Leftrightarrow$ 0 ~ 65535 | 'a' | java.lang.Character |
- プリミティブ型はメモリ上にただの値です。
- 全てのJavaオブジェクトはプリミティブ型の複合です。
参照型とは
参照型(reference type)はオブジェクト(クラスのインスタンス)を参照(refer to)するデータの型(type of data)です。
参照(reference)はオブジェクトの所在場所のメモリアドレスを保存することによってこのオブジェクトを指しています。
参照型にはnullを割り当てる(assign)ことができますが、プリミティブ型にはできません。
Test.java
public class Test {
public static void main(String[] args) {
String str = null; // str does not currently refer to an object
int num = null; // DOES NOT COMPILE
}
}
result
% javac Test.java
Test.java:4: エラー: 不適合な型: <null>をintに変換できません:
int num = null;
^
エラー1個
Integerを使う
Integerはintに対応しているオブジェクト型なので、nullを割り当てることやメソッドを呼び出すことができます。
ここで、Oracle公式ドキュメントを読むのがおすすめです→Integer日本語, Integer英語
Test.java
import java.lang.Integer;
public class Test {
public static void main(String[] args) {
// フィールド
System.out.println("Integerはプリミティブ型" + Integer.TYPE + "のラッパークラスです");
System.out.println("Integer値を表すビット数は:" + Integer.SIZE);
System.out.println("Integer値を表すバイト数は:" + Integer.BYTES);
System.out.println("Integer値に設定可能な最大値は:" + Integer.MAX_VALUE);
System.out.println("Integer値に設定可能な最小値は:" + Integer.MIN_VALUE);
// int, Integer, Stringの間の変換
// int -> Integer
// Integer notGood = new Integer(123); // NOT RECOMMENDED
Integer num0 = Integer.valueOf(123);
Integer num1 = 123; // autoboxing
// String -> Integer
Integer num2 = Integer.valueOf("123");
// Integer bad0 = Integer.valueOf("12.3"); // throws NumberFormatException
// Integer -> int
int num3 = num0.intValue();
// String -> int
int num4 = Integer.parseInt("123");
// int bad1 = Integer.parseInt("12.3"); // throws NumberFormatException
// int -> String
String numStr0 = Integer.toString(123);
// Integer -> String
String numStr1 = num0.toString();
}
}
result
% javac Test.java
% java Test
Integerはプリミティブ型intのラッパークラスです
Integer値を表すビット数は:32
Integer値を表すバイト数は:4
Integer値に設定可能な最大値は:2147483647
Integer値に設定可能な最小値は:-2147483648