黑马程序员技术交流社区
标题: Integer的疑惑? [打印本页]
作者: 高昌德 时间: 2014-11-5 19:43
标题: Integer的疑惑?
Integer m = 128;
Integer n = 128;
1:System.out.println("m==n"+(m==n));
Integer a = 127;
Integer b = 127;
2:System.out.println("a==b"+(a==b));
1为false;2为true
视频里说127为byte类型的已存在,不用再开辟新空间,所以a b 指向同一对象故为true。
还是很迷惑,求详细的解释,,,
作者: wf111sxwf 时间: 2014-11-5 20:46
128是个特例,当Integer的值刚好是一个字节时不会创建新的对象,而是直接用已经有了的对象,所以2是true.
作者: wf111sxwf 时间: 2014-11-5 20:47
注意是刚好是一个字节 不是而不是一个字节以内。
作者: sk0806 时间: 2014-11-5 21:24
享元模式
在自动装箱过程中,对于-128~127之间的值,会在内存中被重用,始终保持一个对象。对于不在此范围内的值,会在装箱过程中,每次都创建一个对象,就相当于你没有使用装箱而是用new来实例化对象一样
作者: javaAndroid 时间: 2014-11-5 22:08
楼上说得对,当数值处于byte的数值范围内,就会发生重用,超出范围就不会发生。
作者: LoveStoned 时间: 2014-11-5 22:37
貌似byte范围内的都是指向同一对象
作者: 高昌德 时间: 2014-11-6 11:21
知道了,这是个规定啊,在-128~127就不会新建对象
作者: dong53821713 时间: 2014-11-6 11:50
-128~127的在常量池都已经存在了,不会在创建新的对象,会先从用常量池里的
作者: Evred 时间: 2014-11-6 12:36
1为false是因为Integer调用的是:Integer.valueOf();刚好关键在于这个valueOf()方法:它在java源程序中是这样定义的: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);
}
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 = new Integer(i - 128);
}
}
当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,会直接从这个缓存中返回一个对象,否则就new一个Integer对象。
所以1的结果就返回了false。
作者: wf111sxwf 时间: 2014-11-8 12:39
那天回答错误了 看视频的时候没听清楚 一直以为是一个字节才当成同一个对象,看了同学们的回答我又回去看了下视频 是一个字节以内 ,在这里更正下。。。唉 抱歉了啊 误导人了~~
作者: scoto263 时间: 2014-11-8 15:21
回答的真精辟,学历到了。。!!!!!!!!
作者: scoto263 时间: 2014-11-8 15:24
回答的真精辟,学历到了。。!!!!!!!!
作者: 王会涛 时间: 2014-11-8 16:01
范围问题,-128~127,,128超出范围,所以每次都新创建128的对象,内存地址当然不一样!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |