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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 殷挥笔 中级黑马   /  2013-11-27 11:44  /  1396 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. int i1 = 137;
  2. int i2 = 137;
  3. System.out.println(i1 == i2);//ture

  4. Integer a1 = 13;
  5. Integer a2 = 13;
  6. System.out.println(a1 == a2);//ture

  7. Integer b1 = 137;
  8. Integer b2 = 137;
  9. System.out.println(b1== b2);//flase
复制代码

为什么会出现这种情况,视频上看了几遍,还是有点看不懂。求各位大神详细解释。

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
枫儿 + 1 + 5 神马都是浮云

查看全部评分

6 个回复

倒序浏览
你看享元模式了么?java把byte范围内的数都单独封装成对象了,就像String一样,所以你的Iteger a1=13;在内存中并不是赋值的动作,只是把a1指向了13。所以a1和a2都是同时指向一个对象,所以是真,byte的范围最大到127,它以内的都是对象,我是这么理解的,i1和i2比较的是两个数是否相同

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
枫儿 + 1 + 5 赞一个!

查看全部评分

回复 使用道具 举报
-128 ~ 127这个范围内的值都在一个常量池内,封装对象相当于引用同一个对象!
超过这个范围的值封装成对象相当于一个新的对象!

共同进步!{:soso_e141:}

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
枫儿 + 1 + 5 赞一个!

查看全部评分

回复 使用道具 举报
最后一组代码,自动装箱。如果如果数值在byte类型范围内。如果该对象数值重复出现,多个引用其实指向的同一个Integer对象。 但是如果超出byte范围,都会生成新的Integer对象 。所以b1,b2是俩不同对象,所以就false了。
回复 使用道具 举报
这应该是JDK 1.5升级以后Integer的新特性
当数值在byte范围内时,对于新特性,如果该对象已存在则不会再开辟新空间,直接指向该对象
byte的范围为-128~127
a1和a2在byte范围内,所以a1和a2指向的是同一个对象,a1 == a2 为true
b1和b2不在byte范围内,所以对于b1和b2,程序会为其各开辟新的空间,b1和b2指向的是不同的对象
b1 ==b2 为false

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1 赞一个!

查看全部评分

回复 使用道具 举报
谢谢各位!弄明白了!!前面学的都还给老师了       T.T      版主求改成提问结束,问题已经解决了!不知道怎么改这个
回复 使用道具 举报
http://bbs.itheima.com/thread-100952-1-1.html看看这个帖子,你应该就懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马