就拿 int和Integer来说吧 int i = new Integer(2);这就是自动解箱Integer i = 3; 这就是自动装箱注意 jdk1.5以后才有的哟 。。
auto-boxing就是比如Integer a = 10,用以前版本的编译器是编译不过的,从语法上讲应该是Integer a = new Integer(10),不过现在的编译器可以编译通过,它给你自动在内部自动打包成:Integer a = new Integer(10)。不过有一点,java当中从-128到+127是在常量池中的,也就是说你Integer a = 10,Integer b = 10,那么这个a和b是个引用是在栈内存当中(关于栈内存和堆内存,我这里假设你清楚java虚拟机机制了哈),打包之前编译器先去常量池当中找10,如果存在则不用打包。a==b比较的是值的地址,输出为true。当出了-128到到127,这时候在常量池中就不存在这个值了,这时候编译器就自动打包比如Integer a = new Integer(128),Integer b = new Integer(128),由于是new出来的对象,他存放在堆内存中,而比较a==b比较的是a和b的栈内存引用地址输出为falsepublic class MainFrame{ public static void main(String[] args){ Integer a1 = 127; Integer b1 = 127; System.out.print("127==127:"); System.out.println(a1==b1);
int i = new Integer(2);这就是自动解箱Integer i = 3;
这就是自动装箱注意 jdk1.5以后才有的哟 。。
public static void main(String[] args){
Integer a1 = 127;
Integer b1 = 127;
System.out.print("127==127:");
System.out.println(a1==b1);
Integer a2 = 128;
Integer b2 = 128;
System.out.print("128==128:");
System.out.println(a2==b2);
Integer a4 = -128;
Integer b4 = -128;
System.out.print("-128==-128:");
System.out.println(a4==b4);
Integer a5 = -129;
Integer b5 = -129;
System.out.print("-129==-129:");
System.out.println(a5==b5);
}
}输出结果:127==127:true
128==128:false
-128==-128:true
-129==-129:false不知道你懂了没有啊
这位兄台的解释基本不对。估计是受CSDN的月经贴(xxxx创建了个几个String对象)的影响了。 首先所有的数字都在常量池中,并不是只有-128到127.其次Integer缓存了-128到127所表示的对象和常量池并无多大关系。(我说的常量池就是一般大家说的常量池 constant pool)
给你贴上Integer.valueOf()的源代码就一切都明了了: private static class IntegerCache {
private IntegerCache(){} static final Integer cache[] = new Integer[-(-128) + 127 + 1]; static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
} 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);
}