JAVA int自动装箱
int 转 Integer:
Integer int127_1 = 127; Integer int127_2 = 127; System.out.println("int127_1 == int127_2 : " + (int127_1 == int127_2)); Integer int128_1 = 128; Integer int128_2 = 128; System.out.println("int1000_1 == int1000_2 : " + (int128_1 == int128_2));
运行结果为:
int127_1 == int127_2 : true int1000_1 == int1000_2 : false
通过反编译的方法,我们发现int在进行自动装箱的时候,调用了Integer.valueOf方法:
Code:
0: bipush 127
2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: bipush 127
8: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
11: astore_2
12: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
15: new #4 // class java/lang/StringBuilder
18: dup
19: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
22: ldc #6 // String int127_1 == int127_2 :
24: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/
而我们查看Integer.valueOf()方法:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
Integer.valueOf()方法,默认当int的值在-128~127之间时,会采用缓存的方式提高性能,返回的是一个数组中的值