A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高昌德 中级黑马   /  2014-11-5 19:43  /  1405 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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。
还是很迷惑,求详细的解释,,,


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

12 个回复

倒序浏览
128是个特例,当Integer的值刚好是一个字节时不会创建新的对象,而是直接用已经有了的对象,所以2是true.
回复 使用道具 举报
注意是刚好是一个字节  不是而不是一个字节以内。
回复 使用道具 举报
享元模式
在自动装箱过程中,对于-128~127之间的值,会在内存中被重用,始终保持一个对象。对于不在此范围内的值,会在装箱过程中,每次都创建一个对象,就相当于你没有使用装箱而是用new来实例化对象一样

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上说得对,当数值处于byte的数值范围内,就会发生重用,超出范围就不会发生。
回复 使用道具 举报
貌似byte范围内的都是指向同一对象
回复 使用道具 举报
知道了,这是个规定啊,在-128~127就不会新建对象
回复 使用道具 举报
-128~127的在常量池都已经存在了,不会在创建新的对象,会先从用常量池里的
回复 使用道具 举报
Evred 中级黑马 2014-11-6 12:36:12
9#
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。
回复 使用道具 举报 1 0
那天回答错误了  看视频的时候没听清楚 一直以为是一个字节才当成同一个对象,看了同学们的回答我又回去看了下视频  是一个字节以内 ,在这里更正下。。。唉 抱歉了啊  误导人了~~
回复 使用道具 举报
Evred 发表于 2014-11-6 12:36
1为false是因为Integer调用的是:Integer.valueOf();刚好关键在于这个valueOf()方法:它在java源程序中是这 ...

回答的真精辟,学历到了。。!!!!!!!!
回复 使用道具 举报
Evred 发表于 2014-11-6 12:36
1为false是因为Integer调用的是:Integer.valueOf();刚好关键在于这个valueOf()方法:它在java源程序中是这 ...

回答的真精辟,学历到了。。!!!!!!!!
回复 使用道具 举报
范围问题,-128~127,,128超出范围,所以每次都新创建128的对象,内存地址当然不一样!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马