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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

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

23 个回复

倒序浏览
看下面两个例子,你就明白了;
1. String str1 = "abc";
    System.out.println(str1 == "abc");

步骤:
1) 栈中开辟一块空间存放引用str1;
2) String池中开辟一块空间,存放String常量"abc";
3) 引用str1指向池中String常量"abc";
4) str1所指代的地址即常量"abc"所在地址,输出为true;



2. String str2 = new String("abc");
    System.out.println(str2 == "abc");

步骤:
1) 栈中开辟一块空间存放引用str2;
2) 堆中开辟一块空间存放一个新建的String对象"abc";
3) 引用str2指向堆中的新建的String对象"abc";
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false;
回复 使用道具 举报 1 0
初学者,不是很清楚,想问2楼,这个两个字符串之间比较不是不能用==,应该用equals方法吗?字符处用==不是只是检测二者是否指向同一个对象的吗?
回复 使用道具 举报
本帖最后由 徐非 于 2014-7-14 12:57 编辑

2楼讲得很详细。
正好刚看到毕老师的数组部分的视频,讲到内存结构,结合笔记说说我个人的理解,不对的地方请大家多多指点

笔记内容:
内存结构:Java程序在运行时,需要在内存中分配空间。为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。              栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放。
              堆内存:数组和对象,通过new建立的实例都存放在堆内存中。
                            每一个实体都有内存地址值
                            实体中的变量都有默认初始化值
                            实体不在被使用,会在不确定的时间内被垃圾回收器回收
              方法区,本地方法区,寄存器
  1. String aa="abc";
  2. String bb=new String("abc");
  3. System.out.println(aa==bb);
复制代码

个人理解,变量aa和bb都存放在栈内存中,变量aa的值就是初始化值"abc",而变量bb的值是String类型对象"abc"在堆内存中的地址,"abc"肯定不等于一个地址了




回复 使用道具 举报
aa和bb引用的都是"abc"这个常量,但是aa和bb是不同的内存地址,而==是数值比较,如果你用aa.equal(bb)那么输出的是true
回复 使用道具 举报
String是引用类型,
引用类型存在的是地址的指针
你如果直接用==比较的是地址值,即使你存放在堆内存中的内容是一样的但是他们 的指针是指向的两个位置
我觉得是这样

回复 使用道具 举报
崔MQ 发表于 2014-7-14 13:03
aa和bb引用的都是"abc"这个常量,但是aa和bb是不同的内存地址,而==是数值比较,如果你用aa.equal(bb)那么 ...

你前面说aa,bb的值是一样的,后面说“==”是数值比较,那这样因该“==”输出的结果为True;而比较内存地址的equal(),应该为False吧,aa,bb它们放置的内存地址是不一样的呀。。
回复 使用道具 举报
blue_sky 发表于 2014-7-14 11:08
看下面两个例子,你就明白了;
1. String str1 = "abc";
    System.out.println(str1 == "abc");

也就是说这俩种存放方式是栈,,和堆的问题。。是不是这样理解???
回复 使用道具 举报
肖晨 初级黑马 2014-7-14 16:25:27
9#
:L一个是变量,一个是地址,怎么能是一回事呢?
回复 使用道具 举报
崔MQ 中级黑马 2014-7-15 12:00:44
10#
琳以沫 发表于 2014-7-14 16:11
你前面说aa,bb的值是一样的,后面说“==”是数值比较,那这样因该“==”输出的结果为True;而比较内存地 ...

aa,bb在内存中有各自的地址,而==是数值比较,所以它比较的是aa,bb的地址去了,而equal函数其实要重写的,在String中已重写,比较的是内容是否相同。
回复 使用道具 举报
本帖最后由 小七 于 2014-7-15 13:01 编辑

因为==比较的是对象也可以称为内存地址,String aa = "abc"只有一个对象,而String bb = newString("abc");有两个对象,一个是"abc"的对象,一个是new String的对象。对象的数量都不一样。比较肯定为false。
回复 使用道具 举报
我记得好像论坛哪里有==和equals的专贴 我找找 找到了再来发链接
回复 使用道具 举报
blue_sky 发表于 2014-7-14 11:08
看下面两个例子,你就明白了;
1. String str1 = "abc";
    System.out.println(str1 == "abc");

好的。。谢谢了。。
回复 使用道具 举报
徐非 发表于 2014-7-14 12:51
2楼讲得很详细。
正好刚看到毕老师的数组部分的视频,讲到内存结构,结合笔记说说我个人的理解,不对的地方 ...

谢谢了。。。:)
回复 使用道具 举报
引用,赋值,肯定不一样
回复 使用道具 举报
F@C 中级黑马 2014-7-18 11:31:14
16#
进来学习
回复 使用道具 举报
肖晨 发表于 2014-7-14 16:25
一个是变量,一个是地址,怎么能是一回事呢?

这个,,我也是,,通过前面大神的,,讲解和自己测试了,,才明白。。
回复 使用道具 举报
aa是变量吧,bb是个对象。用“==”结果是false。
要用String的equals方法比较内容才会是true。“==”比的是地址值。
回复 使用道具 举报
2楼很详尽。。。同意
回复 使用道具 举报
一个在栈空间中的,一个在堆空间中的.不是一个对象
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马