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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String aa="abc";
String bb=new String("abc");
System.out.println(aa==bb);

我想的是aa里面的内容是“abc”而bb里面的内容也是“abc”呀,只不过它们前一个没有存储空间,而后一个有存储空间。可以它们的内容是一样的呀。 为啥比较后出来的结果是false??

23 个回复

正序浏览
这个是对象的创建。简单来说,new 是不管内存中是否已经有相同内容的字符串,直接创建新对象。而==是测试两个类的引用是否指向同一个对象,很明显aa和bb不是同一个对象的,所以返回FALSE。楼主说的内容一样,那是equal,equal才是比较字符串内容的。表达能力不好,不知道有没有说明白
回复 使用道具 举报
本帖最后由 帮帮 于 2014-7-18 14:46 编辑

我是借助概念和图来理解的:

栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

堆:存放所有new出来的对象。

常量池:存放字符串常量和基本类型常量(public static final)。

附上图片解析:


回复 使用道具 举报
字符串定义出来后保存在堆内存中,而名字就是aa保存在栈内存中,aa中保存的的是字符串的索引也就是字符串在堆内存中的地址值,而你上面的两个定义方式是导致他们==是false的主要原因,字符串本身就是一个对像,你第一种定义方式只有一个对像就是“abc”而你的第二个定义方式有两个对象new一个“abc”又是一个,详细内容你可以看看第十三天的第一个视频
回复 使用道具 举报
这个是视频第十三天的内容
回复 使用道具 举报
一个在栈空间中的,一个在堆空间中的.不是一个对象
回复 使用道具 举报
2楼很详尽。。。同意
回复 使用道具 举报
aa是变量吧,bb是个对象。用“==”结果是false。
要用String的equals方法比较内容才会是true。“==”比的是地址值。
回复 使用道具 举报
肖晨 发表于 2014-7-14 16:25
一个是变量,一个是地址,怎么能是一回事呢?

这个,,我也是,,通过前面大神的,,讲解和自己测试了,,才明白。。
回复 使用道具 举报
F@C 中级黑马 2014-7-18 11:31:14
16#
进来学习
回复 使用道具 举报
引用,赋值,肯定不一样
回复 使用道具 举报
徐非 发表于 2014-7-14 12:51
2楼讲得很详细。
正好刚看到毕老师的数组部分的视频,讲到内存结构,结合笔记说说我个人的理解,不对的地方 ...

谢谢了。。。:)
回复 使用道具 举报
blue_sky 发表于 2014-7-14 11:08
看下面两个例子,你就明白了;
1. String str1 = "abc";
    System.out.println(str1 == "abc");

好的。。谢谢了。。
回复 使用道具 举报
我记得好像论坛哪里有==和equals的专贴 我找找 找到了再来发链接
回复 使用道具 举报
本帖最后由 小七 于 2014-7-15 13:01 编辑

因为==比较的是对象也可以称为内存地址,String aa = "abc"只有一个对象,而String bb = newString("abc");有两个对象,一个是"abc"的对象,一个是new String的对象。对象的数量都不一样。比较肯定为false。
回复 使用道具 举报
崔MQ 中级黑马 2014-7-15 12:00:44
10#
琳以沫 发表于 2014-7-14 16:11
你前面说aa,bb的值是一样的,后面说“==”是数值比较,那这样因该“==”输出的结果为True;而比较内存地 ...

aa,bb在内存中有各自的地址,而==是数值比较,所以它比较的是aa,bb的地址去了,而equal函数其实要重写的,在String中已重写,比较的是内容是否相同。
回复 使用道具 举报
肖晨 初级黑马 2014-7-14 16:25:27
9#
:L一个是变量,一个是地址,怎么能是一回事呢?
回复 使用道具 举报
blue_sky 发表于 2014-7-14 11:08
看下面两个例子,你就明白了;
1. String str1 = "abc";
    System.out.println(str1 == "abc");

也就是说这俩种存放方式是栈,,和堆的问题。。是不是这样理解???
回复 使用道具 举报
崔MQ 发表于 2014-7-14 13:03
aa和bb引用的都是"abc"这个常量,但是aa和bb是不同的内存地址,而==是数值比较,如果你用aa.equal(bb)那么 ...

你前面说aa,bb的值是一样的,后面说“==”是数值比较,那这样因该“==”输出的结果为True;而比较内存地址的equal(),应该为False吧,aa,bb它们放置的内存地址是不一样的呀。。
回复 使用道具 举报
String是引用类型,
引用类型存在的是地址的指针
你如果直接用==比较的是地址值,即使你存放在堆内存中的内容是一样的但是他们 的指针是指向的两个位置
我觉得是这样

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马