黑马程序员技术交流社区

标题: 大神给讲讲,不明白 [打印本页]

作者: 夜半风    时间: 2014-9-4 19:44
标题: 大神给讲讲,不明白
Integer a=127;
Integer b =127;
a==b;//结果为true,因为a和b 指向了同一个Integer对象,因为当数值在byte范围内时,对于新特性,如果该数值已经能够存在,则不会开辟新空间。

但是        Integer x=new Integer(127);
                Integer y=new Integer(127);
                System.out.println(x==y);//结果为false,这是为什么呢?谁可以告诉我
作者: liaorubei    时间: 2014-9-4 20:13
Integer a=127;
Integer b=127;
因为a=127时,内存中就已经有了127了。所以在b=127时,是直接把127赋值给了b,

还有一个注意点就是,new 关键字是用来开辟新内存空间的,
Integer x=new Integer(127);
Integer y=new Integer(127);
所以x,y赋值的时候是先开辟了两个新的内存空间,然后再分别赋值给x,y,
由于是新开辟出来的两个内存,所以内存地址不一样,x==y的布尔值就是false了。
作者: 陶圣虎    时间: 2014-9-4 20:19
学习下..回味享元模式
作者: 碎流    时间: 2014-9-4 21:04
本帖最后由 碎流 于 2014-9-4 21:06 编辑

哥们你敢new,它就敢创建两个,服不?   这时候是两个内存地址的对象,而对象==就是比较地址值.
作者: 孤鸢    时间: 2014-9-4 21:15
liaorubei 发表于 2014-9-4 20:13
Integer a=127;
Integer b=127;
因为a=127时,内存中就已经有了127了。所以在b=127时,是直接把127赋值给了 ...

学习了,顶个
作者: Peach2014    时间: 2014-9-5 14:38
Integer a = 127;
这段代码的意思是:我到栈内存中去问:有没有一个值为127的变量啊?如果有,好,那我就指向你了。
就好比你到一个班中去找一个叫“127”的人,这个人只有一个。
Integer x = new Integer(127);
这段代码的意思是:我到堆中去说:你们给我个位置,我要存放一个数值为127的Integer类型的变量;不管你内存中有没有值为127的Integer对象,我都要新增一个Integer对象。只不过这两个对象碰到了,会说:噢?你的号码也是127啊?
这种情况就好比我把另一个叫“127”的人加入到这个班上来了,这两个人肯定不可能是同一个人啊!
作者: 28了还能学吗    时间: 2014-9-5 14:39
liaorubei 发表于 2014-9-4 20:13
Integer a=127;
Integer b=127;
因为a=127时,内存中就已经有了127了。所以在b=127时,是直接把127赋值给了 ...

这个解释灰常地道
作者: 28了还能学吗    时间: 2014-9-5 14:41
碎流 发表于 2014-9-4 21:04
哥们你敢new,它就敢创建两个,服不?   这时候是两个内存地址的对象,而对象==就是比较地址值. ...

x y对比是内存地址的对比啊?????????所以地址不一样为false?
作者: 28了还能学吗    时间: 2014-9-5 14:43
Peach2014 发表于 2014-9-5 14:38
Integer a = 127;
这段代码的意思是:我到栈内存中去问:有没有一个值为127的变量啊?如果有,好,那我就 ...

艾玛~~~~解释的太接地气了
作者: 晋一峰    时间: 2014-9-5 14:50
这个 涉及到一个  byte常量池  问题, JAVA语言为了方便操作常用数据,将byte范围的数据(-128~127)做成了一个常量池。  你赋值常量会先判断在不在这个范围内,在的话就从常量池取出,所以 127两个 Integer类型的数据指向了 同一个内存空间,但是 new关键字是开辟新的内存空间的意思,所以会显示false
作者: ___瘦不了    时间: 2014-9-5 16:47
二楼正解
作者: 范鹏霄    时间: 2014-9-5 18:14
顶一个了
作者: MichaelRodman    时间: 2014-9-5 18:21
一旦new就开辟空间了,肯定不一样;
Integer i=4;是自动装箱了吧,再写一个Integer b=4;系统为了节省内存,自动给你指向i.
作者: 小糊涂神    时间: 2014-9-5 18:46
2楼正解,明白new什么意思就懂了。
作者: 郑飞    时间: 2014-9-5 20:04
本帖最后由 郑飞 于 2014-9-5 20:06 编辑

亲 在此楼层之前 建议只看10楼的答案 其他楼有的错有的没说到点 这种小知识点又不是高级技术讨论 自己要弄清楚了 才好告诉别人 很容易误导


作者: 郑飞    时间: 2014-9-5 20:12
楼主看这里
传智播客毕向东Java基础视频教程-day13-14-基本数据类型对象包装类新特性.avi
第7分钟后的100秒 这才是正解
作者: cs8630323    时间: 2014-9-5 20:31
liaorubei 发表于 2014-9-4 20:13
Integer a=127;
Integer b=127;
因为a=127时,内存中就已经有了127了。所以在b=127时,是直接把127赋值给了 ...

照你的说法为什么a,b变量改为128却是false,回答有问题
作者: 夜半风    时间: 2014-9-5 21:04
郑飞 发表于 2014-9-5 20:04
亲 在此楼层之前 建议只看10楼的答案 其他楼有的错有的没说到点 这种小知识点又不是高级技术讨论 自己要弄 ...

学习了 谢谢大家
作者: 夜半风    时间: 2014-9-5 21:05
谢谢大家了
作者: 夜半风    时间: 2014-9-5 21:11
碎流 发表于 2014-9-4 21:04
哥们你敢new,它就敢创建两个,服不?   这时候是两个内存地址的对象,而对象==就是比较地址值. ...

一开始不明白 现在明白了
作者: 夜半风    时间: 2014-9-5 21:12
郑飞 发表于 2014-9-5 20:04
亲 在此楼层之前 建议只看10楼的答案 其他楼有的错有的没说到点 这种小知识点又不是高级技术讨论 自己要弄 ...

10楼去哪儿了
作者: 郑飞    时间: 2014-9-5 21:22
夜半风 发表于 2014-9-5 21:12
10楼去哪儿了

;P被你推荐了 自然就跑前面去了啊
作者: 夜半风    时间: 2014-9-5 22:45
郑飞 发表于 2014-9-5 21:22
被你推荐了 自然就跑前面去了啊

我能说不是我推荐的吗 他自己跑到前面去的
作者: 嘿~~    时间: 2014-9-5 22:52
后面的是创建了两个不同的对象。比如:String s1 = new  String("haha");   String s2 = new  String("haha");    s1与s2实不相等的,因为它们是两个对象
作者: 嘿~~    时间: 2014-9-5 22:54
Peach2014 发表于 2014-9-5 14:38
Integer a = 127;
这段代码的意思是:我到栈内存中去问:有没有一个值为127的变量啊?如果有,好,那我就 ...

你的回答真形象,真好
作者: 沈木生    时间: 2014-9-5 22:59
很多人都很热心帮你,2楼很明显的答案了
作者: 郑飞    时间: 2014-9-5 23:36
夜半风 发表于 2014-9-5 22:45
我能说不是我推荐的吗 他自己跑到前面去的

...... 那就不知道了 别纠结这个了 知道答案就好了
作者: fouraa    时间: 2014-9-6 17:46
一楼有理
作者: 家进    时间: 2014-9-6 18:18
a,b的值是在常量池里直取的。是同一个对象。x,y是在堆开辟的新空间,new一次一个对象。SO。。。懂?
作者: 哈达洋    时间: 2014-9-6 21:12
解释的都很好
作者: Java黑马    时间: 2014-9-6 21:38
一个byte取值范围问题
作者: likeermei    时间: 2014-9-6 22:04
碎流 发表于 2014-9-4 21:04
哥们你敢new,它就敢创建两个,服不?   这时候是两个内存地址的对象,而对象==就是比较地址值. ...

你敢这么回答,答案就必须敢对。
作者: sunny~    时间: 2014-9-6 23:40
~~~~~~~~~~~~~~~~~~~~来瞅瞅
作者: 张晓永    时间: 2014-9-7 20:44

Integer a=127;//这是往常量池中添加一个,常量数值,而不是给变量a符值,然后把常量池中的这个数值的地址,符给变量a。

Integer b=127;//这一步还是往常量池中添加一个常量,但是如果常量中有这个数值就不填加了,然后把这个数值的地址,符给变量b。
所以a==b就是true了,地址相同吗,127=127用的是同一个数的地址。
而Integer x=new Integer(127);
Integer y=new Integer(127);
是在堆内存中开辟了俩片不同的空间,里边放了俩个,常量池中的地址。
==比较的是地址,俩片堆内存空间的地址当然不相同了。

作者: sunny~    时间: 2014-9-7 21:20
Peach2014 发表于 2014-9-5 14:38
Integer a = 127;
这段代码的意思是:我到栈内存中去问:有没有一个值为127的变量啊?如果有,好,那我就 ...

讲的好生动:loveliness:
作者: bullfrog    时间: 2014-9-7 21:25
只要明确写了new,就已经会在堆内存里开辟空间了。




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