Integerの「エピソード」

2612 ワード

public class IntegerTest {

	public static void main(String[] args) {
		/*Integer i1 = 127;
		Integer i2 = 127;
		Integer i3 = Integer.valueOf(127);*/
		
		Integer i1 = 128;
		Integer i2 = 128;
		Integer i3 = Integer.valueOf(128);
		
		if (i1 == i2)
			System.out.println("i1 == i2 is true!");
		else
			System.out.println("i1 == i2 is false!");

		if (i1 >= i2)
			System.out.println("i1 >= i2 is true!");
		else
			System.out.println("i1 >= i2 is false!");

		if (i1 == i3)
			System.out.println("i1 == i3 is true!");
		else
			System.out.println("i1 == i3 is false!");

	}

}

値が127の場合、出力は:i 1==i 2 is true!i1 >= i2 is true! i1 == i3 is true! 値が128の場合、出力は:i 1==i 2 is false!i1 >= i2 is true! i1 == i3 is false! “Integer i1 = 127;”JDK 1.4でコンパイルできない場合は、「Type mismatch:cannot convert from int to Integer」というエラーが表示され、「Integer i 1=new Integer(127);」と書き換えられます.“Integer i1 = 127;”JDK 1.5でコンパイルできます.これがオートボックス(Autoboxing)とオートボックス(Auto-Unboxing)です.自動梱包(Autoboxing)プロパティにより、Javaはintなどの簡単なデータ型を対応する梱包タイプ(Integerなど)に自動的に梱包します.問題を理解しやすくするために、Jadで上のコードを逆コンパイルします.以下のようにします.
import java.io.PrintStream;

public class Test {

	public Test() {
	}

	public static void main(String args[]) {
		Integer i1 = Integer.valueOf(128);
		Integer i2 = Integer.valueOf(128);
		Integer i3 = Integer.valueOf(128);

		if (i1 == i2)
			System.out.println("i1 == i2 is true!");
		else
			System.out.println("i1 == i2 is false!");

		if (i1.intValue() >= i2.intValue())
			System.out.println("i1 >= i2 is true!");
		else
			System.out.println("i1 >= i2 is false!");

		if (i1 == i3)
			System.out.println("i1 == i3 is true!");
		else
			System.out.println("i1 == i3 is false!");
	}
}

「Integer i 1=128;JDK 1.5で「Integer i 1=Integer.valueOf(128);」にコンパイルされるはずです.javaを見てlang.IntegerでvalueOfのソースコードについてどうなっているか:public static Integer valueOf(int i){final int offset=128;if(i>=-128&&i<=127){//must cache return IntegerCache.cache[i+offset];}return new Integer(i); } ご覧のように、
この値は-128~127の間でcached(キャッシュ)され、複数回使用するとメモリが節約され、パフォーマンスが向上します.この範囲内でない場合、新しいInteger Object instanceが生成されます.
このように"=="を行うと,2つの異なるObject referencesを比較するためfalseとなる.