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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马上都有 中级黑马   /  2014-5-20 18:19  /  1328 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


问题是这样的:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
输出了true;

String str3 = "efg";
String str4 = new String("efg");
System.out.println(str3 == str4);
结果是false;

7 个回复

正序浏览
二楼正解                                                
回复 使用道具 举报
Jero 中级黑马 2014-5-21 00:00:28
7#
说的都说完了。 == 是比较物理地址  equals 比较值。
回复 使用道具 举报
我来完了,2楼正解
回复 使用道具 举报
本来想回复讲解一下呢,看了2楼的解释,觉得没必要再多说什么了。
回复 使用道具 举报
1.只要记得 “==“是比较的两个对象的引用,是个地址值,有内存分配的。

2.上面的是在常量池中创建了一个字符串对象“abc”,并且分配了一个地址值,然后str1指向它,str2创建时,因为对象存在于常量池中,内存就不再创建新的“abc”,而是将str2指向它,所以两个的地址值是一样的,即为true;

3.下面这个,new String(),JVM就会在栈内存中开辟一个新的空间,并且有一个地址值,给这个对象赋值时是将字符串"abc"的地址赋给了它。所以,String str2 = new String("abc");内存中有两个对象,str2指向来栈内存中的那个String对象。而str1指向的是“abc”的引用,两个指向的地址值不同,所以为false。
回复 使用道具 举报
前一组在常量池中只有一个“abc”str2只是增加了一个指针
后一组一个在常量池一个是new的对象 而==比较的是是否为一个对象
所以是false
回复 使用道具 举报
  1. String s = "abc";//创建一个字符串对象在常量池中。
  2. String s2 = new String("abc");//创建两个对象   一个new  一个字符串对象在堆内存中。
  3. boolean b = (s==s2);//b为false   比较的是地址
  4. boolean b2 = s.equals(s2);//b2为true   重写了Object的equals方法,  比较的是俩个字符串的内容。
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

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