Java基本数据类型和包装类的声明、编译和初始化
在平时的开发中,声明一个数字类型的变量,一般有以下几种形式:
int a = 1;Integer b = 1;Integer c = new Integer(1);Integer d = Integer.valueOf(1);
Code: Stack=3, Locals=5, Args_size=1 //将int型值1推至栈顶 0: iconst_1 //将栈顶的int型值放入本地变量表中的第二个 1: istore_1 //将int型值1推至栈顶 2: iconst_1 //调用java.lang.Integer的静态方法valueOf(java.lang.Integer),参数是栈顶的元素,并将返回值放入栈顶 3: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; //将栈顶的引用类型值放入本地变量表中的第三个 6: astore_2 //创建一个Integer对象 7: new #17; //class java/lang/Integer //将该对象的引用压入栈顶 10: dup //将int型值1推至栈顶 11: iconst_1 //调用java.lang.Integer类的初始化方法,该方法参数是栈顶的int型元素,返回值放入栈顶 12: invokespecial #22; //Method java/lang/Integer."<init>":(I)V //将栈顶的引用类型值放入本地变量表中的第四个 15: astore_3 //将int型数值1压制栈顶 16: iconst_1 //调用java.lang.Integer的静态方法valueOf(java.lang.Integer),参数是栈顶的元素,并将返回值放入栈顶 17: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; //将栈顶的引用类型值放入本地变量表中的第四个 20: astore 4 22: return
System.out.println(a == b);System.out.println(a == c);System.out.println(a == d);System.out.println(b == c);System.out.println(b == d);System.out.println(c == d);
public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }
Integer e = 200;Integer f = 200;System.out.println(e == f);
Integer a = 1;Integer b = 2;Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;Long g = 3L;System.out.println(c == d);System.out.println(e == f);System.out.println(c == (a+b));System.out.println(c.equals(a+b));System.out.println(g == (a+b));System.out.println(g.equals(a+b));