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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夜班心桥 中级黑马   /  2014-10-14 16:29  /  1784 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. Integer i = 127;
  2. Integer i1 = 127;
  3. 此时,i和i1指向同一个内存地址。i==i1为true。
  4. 而,Integer s = new Integer(127);
  5. Integer s1 = new Integer(127);
  6. 为什么s和s1指向了不同的地址?
复制代码

8 个回复

倒序浏览
第一段代码 两个变量指向同一对象————这个对象是整数127 ,我想这个你没问题吧
回复 使用道具 举报
本帖最后由 英雄传说ER 于 2014-10-14 16:48 编辑

第二段代码 你new了两个integer对象 s指向第一个 s1指向第二个 这两个对象不是同一个对象,同时s和s1作为integer类(类类型变量) 它也可以建立对象127  也就是说s和s1是两个对象  只是对象的内容相同而已 但是他们还是不同的对象

评分

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

查看全部评分

回复 使用道具 举报
英雄传说ER 发表于 2014-10-14 16:44
第一段代码 两个变量指向同一对象————这个对象是整数127 ,我想这个你没问题吧 ...

Integer i = 127; 这里是自动装箱,也就相当于 new Integer(127)。这样的话,怎么解释呢?
回复 使用道具 举报
夜班心桥 发表于 2014-10-14 17:49
Integer i = 127; 这里是自动装箱,也就相当于 new Integer(127)。这样的话,怎么解释呢? ...

汉字“相当于”的意思不是“等于”,例如 short s+=5;相当于 short s=s+5; 但是它们在内存中的操作还是有区别的 就好像说你今天省了5块钱,相当于你赚了5块钱,但并不是说你就赚了5块钱。
Integer i=127; Integer i= new Integer(127); 在你仅仅只是赋值的时候是没区别的,但在内存中的操作是有区别的,相信老师应该给你说过 第一个只有一个对象,而第二个是有两个对象
自动装箱是1.2版本以后为了简化操作所作的一个动作而已  正确来讲
把 Integer i= new Integer(); i = 127; 变成 Integer i= new Integer(127);这才是自动装箱
上面那个只是相当于这句代码,而不是完全等同于这句代码
回复 使用道具 举报
英雄传说ER 发表于 2014-10-14 21:45
汉字“相当于”的意思不是“等于”,例如 short s+=5;相当于 short s=s+5; 但是它们在内存中的操作还是有 ...
  1. 首先感谢您的讲解。刚才查阅了下资料,发现,Integer i = 127,实际上就是调用了Integer.valueOf(127).然后又看了valueof方法的源码,才恍然大悟。只有当满足-128<=i<=127时,返回的是一个静态数组中的包装类型,否则,重新创建一个i值的Integer对象。
复制代码
回复 使用道具 举报
你弄懂了吗?给我说一下?
回复 使用道具 举报
就是现在 发表于 2014-10-15 09:57
你弄懂了吗?给我说一下?

Integer i=127, i1=127;这里实际上就是这样:Integer i = Integer.valueOf(127); Integer i1 = Integer.valueOf(127);  然后再看一下valueOf()的源码,就是下面这段代码:
  1. public static Integer valueOf(int i) {
  2.         if (i >= IntegerCache.low && i <= IntegerCache.high)
  3.             return IntegerCache.cache[i + (-IntegerCache.low)];
  4.         return new Integer(i);
  5.     }
复制代码

这里它用了缓存原理,先不用管它。low代表-128,high=127. 其中的cache【】是一个静态的Integer类型的数组,当i在【-128,127】这个区间时,直接返回静态数组中的一个Integer对象。当i不满足【-128,127】这个区间时,才重新new一个i值得Integer对象。
回复 使用道具 举报
其他基本类型包装类也一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马