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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李方哲 黑马帝   /  2011-9-29 01:45  /  2897 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[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呢,我有点小小的不明白。

9 个回复

倒序浏览
黑马网友  发表于 2011-9-29 02:03:16
沙发
享元模式,系统认为较小的变量使用的频率比较高,所以在-128~128之间如果包装成一个Integer对象,则会放到内存里面,如果下次再次被用到,就直接从内存里面拿,而不会去new一个新的对象,但是小于等于-128或大于等于128就会new一个新的对象,分析
Integer n3 = 128;
Integer n4 = 128;
n3和n4根本不是同一个对象了
所以
System.out.println(n3 == n4);//false
回复 使用道具 举报
楼上,如果我将n3和n4的值改成127或者在-128与127之间,n3和n4返回的是ture,你信不,?我之前没测试过,今天我专门测试了,你也可以测试一下,原因是在这个范围内数据存放在缓存中,但是具体为什么在缓存中返回ture在堆中返回false,照理说String也应该存放在堆中不是么,String有享元模式为什么Integer没有,您千万别告诉我String很特殊,我就是想知道他为什么特殊,我大胆的猜测一下,也许还是因为内存机制的原因。
[ 本帖最后由 李方哲 于 2011-09-29  02:35 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-9-29 02:55:07
板凳

回复 藤椅 的帖子

大哥,我说的就是这个问题啊,你数字大于-128而小于128的话就会放到内存里面缓存起来,方便重复使用,而小于等于-128或大于等于128的话,就会new一个对象,
再简单点举个例子说:两个integer对象都等于100的话,其实他们都是内存里的一个对象,因为他们都大于等于-128并且小于等于128,如果两个integer对象都等于200的话,他们都分别new了一个对象,因为他们都大于等于128,所以他们不相等,明白没有?
回复 使用道具 举报
黑马网友  发表于 2011-9-29 02:56:35
报纸
懂了,~~咱赶紧睡觉吧,三点了,~~~我刚才又查了下资料,呵呵,
回复 使用道具 举报
黑马网友  发表于 2011-9-29 02:57:14
地板
这个原理在张孝祥老师的高新部分视频里面的:
11_基本数据的自动拆装箱及享元设计模式.avi
如果这都不能明白,那我也没办法了
回复 使用道具 举报
黑马网友  发表于 2011-9-29 03:05:10
7#

Integer的问题

Integer n3 = 128;
.Integer n4 = 128;
System.out.println(n3 == n4);//false
这个考查的知识点int的取值范围 就可以解决了  还有一个是Integer是应用对象不是原始类型
回复 使用道具 举报
724681149 黑马帝 2011-10-15 01:50:19
8#
你可以这样理解,int的包装类Integer,它也有Strng 一样,存在着缓存池这个概念,只是它的数值作用范围是一个byte而已,即[-128~127]在这期间都是适用的。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
潘永辉 黑马帝 2011-10-16 16:14:59
9#
这就是String的特殊之处,相同的内容都会只开辟一个栈内存空间,所有的对象都会指向这个空间。
回复 使用道具 举报
朱华 黑马帝 2011-10-17 13:45:46
10#
纯手打,请区分。
只简单介绍一下,更多的详情请BAIDU"常量池"。
当你在一个class文件中以String temp = "test"创建字符串常量的时候,它会先去该class文件的常量池中查找是否有值为test的常量,如果有就直接引用它,如果没有则先创建,再引用,故当你再String temp2 = "test"的时候,temp2会找到第一个temp在常量池中创建的test,然后引用他,所以==返回的是true

注:常量池在内存中属于方法区,而方法区的划分是从堆中划分的,所以应该说一个唯一拷贝的String常量,保存的位置应当是堆中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马