BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #30066同步于 2014/5/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

关于java内存求问。

Gewter
2014/5/22镜像同步22 回复
Integer i4 = new Integer(40); Integer i5 = new Integer(40); Integer i6 = new Integer(0); if(i4 == i5 + i6) return true; 为何i4 == i5+i6 啊?搞不懂。。。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
dss886机器人#1 · 2014/5/22
Update: 2014年5月24日 当时回答的时候没有细想,楼下各位大神指出了我的错误 回头看了一下,确实还有很多问题,再重新尝试回答一下: 1.考虑以下代码: 返回是false和true,说明两个new Integer(40)时确实生成了不同新对象, 而Integer i3 = 40和Integer i4 = 40是一个装箱过程, 实际上调用的是Integer.valueOf()函数, 从下面的源码可以看到,在(-128,127)之间返回的是JVM缓存的对象, 因此在这里i3==i4,也证明了我之前的答案是错误的: 2.再考虑以下代码: 返回的是true和false,说明当i2 + i3时,JVM仅仅进行了拆箱操作, 实际上比较的是 i1 == 40,而比较Integer和int的时候JVM会继续拆箱, 40 == 40,因此会返回true,如果将(Integer)(i5 + i6)这样操作, i5 + i6会装箱生成一个新的Integer对象,再比较就会返回false了 感谢@guodanpi @Gewter @gcheng fastislow 等同学的讨论,让我学到了新东西~ =============原答案================ new Interger(i) 的时候,如果 -128<i<127 则返回的是同一个对象 也就是说,这里有 i4 == i5, 然后Integer互相相加的时候,JVM会先拆箱成int类型, 40 + 0 = 40 ,结果还是在-128到127之间, JVM再装箱,设 i7 = i5 + i6 的话, i7 = i5 + i6 = new Interger(40),指向的仍是同一个对象 即i4 == i7 == i5 + i6 【 在 Gewter (骑单车绕北京) 的大作中提到: 】 : Integer i4 = new Integer(40); : Integer i5 = new Integer(40); : Integer i6 = new Integer(0); : ...................
Gewter机器人#2 · 2014/5/22
明白了!解释得好到位!多谢版主! 【 在 dss886 的大作中提到: 】 : new Interger(i) 的时候,如果 -128<i<127 则返回的是同一个对象 : 也就是说,这里有 i4 == i5, : 然后Integer互相相加的时候,JVM会先拆箱成int类型, : ...................
taoch机器人#3 · 2014/5/23
好不容易碰见个会的被抢先了。。 【 在 dss886 (打击楼主) 的大作中提到: 】 : new Interger(i) 的时候,如果 -128<i<127 则返回的是同一个对象 : 也就是说,这里有 i4 == i5, : 然后Integer互相相加的时候,JVM会先拆箱成int类型, : ...................
dss886机器人#4 · 2014/5/23
哇咔咔 【 在 taoch (跪求offer|跪求毕业) 的大作中提到: 】 : 好不容易碰见个会的被抢先了。。
elite1189机器人#5 · 2014/5/23
大神,这都是在哪学的。,推荐本学java的书 【 在 dss886 的大作中提到: 】 : new Interger(i) 的时候,如果 -128<i<127 则返回的是同一个对象 : 也就是说,这里有 i4 == i5, : 然后Integer互相相加的时候,JVM会先拆箱成int类型, : ...................
dss886机器人#6 · 2014/5/23
我开始也不懂..现场Google的... Google “Java Integer()”,有这个: http://blog.163.com/jackswu@yeah/blog/static/140629123201101901813892/ 然后Google “Java Integer() 相加”,有这个 http://zhidao.baidu.com/question/38810926.html 还有这个: http://bbs.chinaunix.net/thread-1048175-1-1.html 然后综合了一下就得出结论了... 至于Java的书,推荐《疯狂Java讲义》,不过这本书不适合入门 【 在 elite1189 (【紫棋团】全都是泡沫,只一刹的花火) 的大作中提到: 】 : 大神,这都是在哪学的。,推荐本学java的书
kingkongman机器人#7 · 2014/5/23
《疯狂讲义》适合什么阶段看呢?从露珠自己的经历来看有没有比较好的进阶书籍推荐呢,露珠都看过哪些? 【 在 dss886 (打击楼主) 的大作中提到: 】 : 我开始也不懂..现场Google的... : Google “Java Integer()”,有这个: : http://blog.163.com/jackswu@yeah/blog/static/140629123201101901813892/ : ................... 通过『我邮2.0』发布
zwan0518机器人#8 · 2014/5/23
去看看Integer的源码,就知道为何了,它内部保存了一个0到128的数组 如果大于128上面的的if判断应该就是false了
dss886机器人#9 · 2014/5/23
啊,我就看过《Head First Java》和《疯狂Java讲义》。。 【 在 kingkongman (kingkongman) 的大作中提到: 】 : 《疯狂讲义》适合什么阶段看呢?从露珠自己的经历来看有没有比较好的进阶书籍推荐呢,露珠都看过哪些? : 【 在 dss886 (打击楼主) 的大作中提到: 】 : 通过『我邮2.0』发布 : ...................