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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ┣┫流枫 中级黑马   /  2014-8-10 21:54  /  2312 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ┣┫流枫 于 2014-8-11 11:20 编辑


程序代码如下:

  1. public class Demo1 {
  2.         public static void main(String[] args) {
  3.                 Integer x=127;
  4.                 Integer y=127;
  5.                 System.out.println(x==y);
  6.                 x=128;
  7.                 y=128;
  8.                 System.out.println(x==y);        
  9.         }
  10. }
复制代码
运行结果:
true
false

为啥是这个结果,求大神解释。

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 淡定

查看全部评分

13 个回复

倒序浏览
本帖最后由 jiangweibin2573 于 2014-8-10 22:03 编辑

了解下享元模式
因为,java为了节约内存,将1字节范围内的整数,在内存中只建立一份,当再建立新的整型对象的时候,他首先去判断内存是否已经有了需要的那个对象,有则直接调用,而不是建立新值。127和128正是1字节的分割线,一字节表示范围(-128,127).所以再次127时,由于在一字节范围内,他去检测内存中已有127,直接引用了。而128超出1字节了,他不会去判断,而是直接去建对象。

评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 赞一个!

查看全部评分

回复 使用道具 举报
亲,你技术分都够了还这么玩。在byte值范围内,如果存在就不重新建
回复 使用道具 举报
如果数值在-128到正127之间,定义的值如果相同,那么都指向同一块空间,因为大多数操作的都是小数据,如果数据超过127那么就是两块空间
回复 使用道具 举报
嗯,给二楼点赞,楼主不懂,可以回去咱看看视频,我记得好像是集合那几天的吧。
回复 使用道具 举报
在-128 到127 的数字,每个数字都只有一个,不会因为实例化对象,而创建新的空间。所以都为TRUE,
超过1 byte,就没实例化一个,开辟一个新空间
回复 使用道具 举报
因byte范围而导致第二个情况下地址值不一样所以FALSE。。。
回复 使用道具 举报
byte的值范围是-128---127
回复 使用道具 举报
kakasa 中级黑马 2014-8-11 10:04:33
9#
额  看了2喽解释还是不懂,回去翻视频了
回复 使用道具 举报
也就是说,Java为节省内存,在一个字节以内的数,如果有了,就直接引用,没有就创建
第一次X=127.因为有了127所以y直接指向X而不是创建新的。
对于超过一个字节的,就需要自己创建,
x=128是新创建的     y=128也是新创建的
回复 使用道具 举报
孤守星空 发表于 2014-8-10 22:01
亲,你技术分都够了还这么玩。在byte值范围内,如果存在就不重新建

入学考试要10技术分 分配名额要25,加起来不是要35分吗
回复 使用道具 举报
Integer对象如果在一个字节之内的数值都是共享的,一个字节的范围就是-128到127,所以地址比较相同。超过1个字节就是单独的对象了,不共享了,多以地址的指向就不同了。所以为false
回复 使用道具 举报
这个是因为Integer类会将常用的数缓存起来,范围是-128-127。当数在这个范围之间,用Integer x =22; Integer y=22的方式创建实例,用到的始终是缓存中的那个22,所以打印会是true。但当用new的方式创建实例时,依然会是false。
回复 使用道具 举报
jiangweibin2573 发表于 2014-8-10 21:59
了解下享元模式
因为,java为了节约内存,将1字节范围内的整数,在内存中只建立一份,当再建立新的整型对象 ...

楼上正解 赞一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马