黑马程序员技术交流社区

标题: Integer对象的判断 [打印本页]

作者: 夜班心桥    时间: 2014-10-14 16:29
标题: Integer对象的判断
  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指向了不同的地址?
复制代码


作者: 英雄传说ER    时间: 2014-10-14 16:44
第一段代码 两个变量指向同一对象————这个对象是整数127 ,我想这个你没问题吧
作者: 英雄传说ER    时间: 2014-10-14 16:45
本帖最后由 英雄传说ER 于 2014-10-14 16:48 编辑

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

作者: 夜班心桥    时间: 2014-10-14 17:49
英雄传说ER 发表于 2014-10-14 16:44
第一段代码 两个变量指向同一对象————这个对象是整数127 ,我想这个你没问题吧 ...

Integer i = 127; 这里是自动装箱,也就相当于 new Integer(127)。这样的话,怎么解释呢?
作者: 英雄传说ER    时间: 2014-10-14 21:45
夜班心桥 发表于 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);这才是自动装箱
上面那个只是相当于这句代码,而不是完全等同于这句代码
作者: 夜班心桥    时间: 2014-10-15 09:50
英雄传说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
你弄懂了吗?给我说一下?
作者: 夜班心桥    时间: 2014-10-15 10:15
就是现在 发表于 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对象。
作者: cs8630323    时间: 2014-10-15 11:16
其他基本类型包装类也一样




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2