0
0

More than 1 year has passed since last update.

Java Silver番外編(Integerと==演算子)

Posted at

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となる。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0