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