java的autoboxing 问题 第一个一定是false,以为==是比较引用是否引用同一个对象,显然不是同一个,为false 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 假如初始值为129,两者都是false-----------------------------是 Integer i = new Integer(129); Integer y = new Integer(129);这样吗? 因为 i 和 j 本身就是 Integer 类型的值,在第二句比较的,也仅仅是对象之间的比较,并不是基本数据类型之间的比较,只不过在计算时转换成了 int 类型,拆箱计算后,对于 [-128,127] 之间的值,在内存中会进行重用,i 和 j 的指针都指向了同一块地方,就像字符串一样,但是对于这个范围之外的值就不会进行重用了,会给它们开僻新的空间。参考《Java语言规范》http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7 首先要明白自动打包和拆包到底是什么对于int和Integer来讲自动打包就是调用Integer.valueOf()自动拆包就是调用Integer.intValue()1. Integer i = new Integer(128); 2. Integer j = new Integer(128); 3. System.out.println(i == j); 4. i--; 5. j--; 6. System.out.println(i == j); 前三行不说了,就是两个对象比较地址第四行相当于int n = i.intValue();n--;i = Integer.valueOf(n);第五行相当于int m = j.intValue();m--;j = Integer.valueOf(m);关键是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); }这是IntegerCache内部类的源代码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); } }cache这个Integer的数组存放了值为-128到127的Integer的对象他是static的,也就是说随着IntegerCache这个类被加载,Integer(-128)到Integer(127)这256个对象就被留在了内存里,除非这个类被卸载掉由于n--之后变为127,在-128到127范围内Integer valueOf(127)返回的就是IntegerCache.cache[127 + 128]所以i就是IntegerCache.cache[127 + 128],即i指向了chche[255]指向的那个对象。同样j也是IntegerCache.cache[127 + 128],j也指向了chche[255]指向的那个对象。但是129的情况就不一样了,--后得到的是128,128不在范围-128到127之中所以返回的是new Integer(128)i,j指向了两个不同的对象 试试这个 Integer i = new Integer(129);Integer j = new Integer(129);127内的从对象池中取。 jdbc 连接数据库的问题 如何在主线程中柔和地结束子线程 java 输出问题 想请问下,下面的代码有什么问题吗?为什么画不出图像??谢谢各位了! 一个奇怪的问题,在jdk1.3环境下运行报错,但是在jcreator下运行正常,有没有人碰到过? Java to C? 在jpanel中用jfilechooser方法来获取图片怎么办? 菜m提问!我想做一个下凹的框框,然后里边放置一些按钮? JAVA中可以做吗? java线程中如何降低CPU的占用率?我这几个线程会不会死锁? 来个大神帮我这个编码方法!!! 50分请各位高手过来帮我一个忙. 在swing中装入word的问题
-----------------------------
是
Integer i = new Integer(129);
Integer y = new Integer(129);
这样吗?
http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7
自动打包就是调用Integer.valueOf()
自动拆包就是调用Integer.intValue()1. Integer i = new Integer(128);
2. Integer j = new Integer(128);
3. System.out.println(i == j);
4. i--;
5. j--;
6. System.out.println(i == j); 前三行不说了,就是两个对象比较地址
第四行相当于
int n = i.intValue();
n--;
i = Integer.valueOf(n);
第五行相当于
int m = j.intValue();
m--;
j = Integer.valueOf(m);关键是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);
}这是IntegerCache内部类的源代码
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);
}
}
cache这个Integer的数组存放了值为-128到127的Integer的对象
他是static的,也就是说随着IntegerCache这个类被加载,Integer(-128)到Integer(127)这256个对象就被留在了内存里,除非这个类被卸载掉由于n--之后变为127,在-128到127范围内
Integer valueOf(127)返回的就是IntegerCache.cache[127 + 128]
所以i就是IntegerCache.cache[127 + 128],即i指向了chche[255]指向的那个对象。
同样j也是IntegerCache.cache[127 + 128],j也指向了chche[255]指向的那个对象。但是129的情况就不一样了,--后得到的是128,128不在范围-128到127之中
所以返回的是new Integer(128)
i,j指向了两个不同的对象
Integer i = new Integer(129);
Integer j = new Integer(129);
127内的从对象池中取。