黑马程序员技术交流社区

标题: 一个小问题 [打印本页]

作者: 李方哲    时间: 2011-9-29 01:45
标题: 一个小问题
[code=java]String str1 = "China";
String str2 = "China";
System.out.println(str1 == str2);//true[/code]
这个返回ture这个原因我知道,我知道的只是String在创建的时候会检查是否有相同的字符串,如果有就指向堆空间里面的这个字符串,所以返回ture,
[code=java]Integer n3 = 128;
Integer n4 = 128;
System.out.println(n3 == n4);//false[/code]
为什么这个地方却是返回false呢,我有点小小的不明白。
作者: 匿名    时间: 2011-9-29 02:03
享元模式,系统认为较小的变量使用的频率比较高,所以在-128~128之间如果包装成一个Integer对象,则会放到内存里面,如果下次再次被用到,就直接从内存里面拿,而不会去new一个新的对象,但是小于等于-128或大于等于128就会new一个新的对象,分析
Integer n3 = 128;
Integer n4 = 128;
n3和n4根本不是同一个对象了
所以
System.out.println(n3 == n4);//false
作者: 李方哲    时间: 2011-9-29 02:34
楼上,如果我将n3和n4的值改成127或者在-128与127之间,n3和n4返回的是ture,你信不,?我之前没测试过,今天我专门测试了,你也可以测试一下,原因是在这个范围内数据存放在缓存中,但是具体为什么在缓存中返回ture在堆中返回false,照理说String也应该存放在堆中不是么,String有享元模式为什么Integer没有,您千万别告诉我String很特殊,我就是想知道他为什么特殊,我大胆的猜测一下,也许还是因为内存机制的原因。
[ 本帖最后由 李方哲 于 2011-09-29  02:35 编辑 ]
作者: 匿名    时间: 2011-9-29 02:55
标题: 回复 藤椅 的帖子
大哥,我说的就是这个问题啊,你数字大于-128而小于128的话就会放到内存里面缓存起来,方便重复使用,而小于等于-128或大于等于128的话,就会new一个对象,
再简单点举个例子说:两个integer对象都等于100的话,其实他们都是内存里的一个对象,因为他们都大于等于-128并且小于等于128,如果两个integer对象都等于200的话,他们都分别new了一个对象,因为他们都大于等于128,所以他们不相等,明白没有?
作者: 匿名    时间: 2011-9-29 02:56
懂了,~~咱赶紧睡觉吧,三点了,~~~我刚才又查了下资料,呵呵,
作者: 匿名    时间: 2011-9-29 02:57
这个原理在张孝祥老师的高新部分视频里面的:
11_基本数据的自动拆装箱及享元设计模式.avi
如果这都不能明白,那我也没办法了
作者: 匿名    时间: 2011-9-29 03:05
标题: Integer的问题
Integer n3 = 128;
.Integer n4 = 128;
System.out.println(n3 == n4);//false
这个考查的知识点int的取值范围 就可以解决了  还有一个是Integer是应用对象不是原始类型
作者: 724681149    时间: 2011-10-15 01:50
你可以这样理解,int的包装类Integer,它也有Strng 一样,存在着缓存池这个概念,只是它的数值作用范围是一个byte而已,即[-128~127]在这期间都是适用的。
作者: 潘永辉    时间: 2011-10-16 16:14
这就是String的特殊之处,相同的内容都会只开辟一个栈内存空间,所有的对象都会指向这个空间。
作者: 朱华    时间: 2011-10-17 13:45
纯手打,请区分。
只简单介绍一下,更多的详情请BAIDU"常量池"。
当你在一个class文件中以String temp = "test"创建字符串常量的时候,它会先去该class文件的常量池中查找是否有值为test的常量,如果有就直接引用它,如果没有则先创建,再引用,故当你再String temp2 = "test"的时候,temp2会找到第一个temp在常量池中创建的test,然后引用他,所以==返回的是true

注:常量池在内存中属于方法区,而方法区的划分是从堆中划分的,所以应该说一个唯一拷贝的String常量,保存的位置应当是堆中。




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