Java Silverの学習中、Integerと==演算子の比較の関係で知ったことがあったので、復習も兼ねてまとめようと思いました。
■Integerの生成方法の違いによる==演算子の結果
public class Main {
public static void main(String[] args) {
Integer i1 = Integer.valueOf(127);
Integer i2 = Integer.valueOf(127);
System.out.println(i1 == i2); // true
Integer i3 = Integer.valueOf(128);
Integer i4 = Integer.valueOf(128);
System.out.println(i3 == i4); // false
Integer i5 = 127;
Integer i6 = 127;
System.out.println(i5 == i6); // true
Integer i7 = new Integer("10");
Integer i8 = new Integer("10");
System.out.println(i7 == i8); // false
Integer i9 = new Integer(10);
Integer i10 = new Integer(10);
System.out.println(i9 == i10); // false
}
}
解説(なぜ結果が違うのか)
■valueOfで生成した場合 + 数値をそのまま代入した場合
Integerクラスの内部にはIntegerCacheを持っている。
このキャッシュはデフォルトでは
-128 ~ 127の整数値をキャッシュし、
128以上は新しいIntegerオブジェクトを生成する
という処理を行う。
Integer.valueOf()メソッドは、キャッシュの範囲に該当するオブジェクトを返すので、
i1とi2は同じオブジェクトを指す事となり、trueが表示される。
i3とi4は128でキャッシュの範囲外なので、新しいIntegerオブジェクトとして生成される。
結果参照先が異なり、falseとなる。
また、リテラルで直接数値を代入した場合(i5,i6)、valuOfメソッドを使用したのと同じ事になるので、同様にtrueとなる。
■newとコンストラクタで生成した場合
newとコンストラクタを用いた生成では、引数で指定した数値をもつオブジェクトの、
メモリアドレスの値が代入される。
結果、i7,i8,i9,i10はそれぞれ新しいオブジェクトのアドレスがそれぞれ代入されているので
falseとなる。
参考文献