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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周兴华 中级黑马   /  2012-8-22 16:16  /  1995 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面这段代码中System.out.println(s2 == s3); 这条语句的结果为什么是false?
public class Test{
public static void main(String[] args){
  String s1 = new String("amit");
  System.out.println(s1.replace('m','r'));
  System.out.println(s1);
  String s3 = "arit";
  String s4 = "arit";
  String s2 = s1.replace('m','r');
  System.out.println(s2);
  System.out.println(s2 == s3);
  System.out.println(s3 == s4);
}
}

5 个回复

倒序浏览
这个问题在论坛上已经出现很多次了~
比较字符串最好用equals(),只因为equals才是真正比较字符串的内容!
但在java中,这个代码即使在两个字符串完全相同的情况下也会返回false
Java中必须使用string1.equals(string2)来进行判断~
如果:
string s1=new String("Hello");
string s2=new String("Hello");
则(s1==s2)=false

如果:
string s1="Hello";
string s2="Hello";
则(s1==s2)=true;
因为他们指向的同一个对象。

如果把其他变量的值赋给s1和s2,即使内容相同,由于不是指向同一个对象,也会返回false。所以建议使用equals(),因为equals比较的才是真正的内容

评分

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

查看全部评分

回复 使用道具 举报
System.out.println(s2 == s3);

相当于System.out.println( s1.replace('m','r')  == "arit");
而 前者 替换元素后 仍然是new String("arit"); 是一个新的对象
和在String Pool字符换缓冲池z中的"arit"不是同一个对象,所以引用不同 故而 == 为false
但是.equals的结果是相同的
回复 使用道具 举报
直接代码中加注释,楼主看吧
  1. public static void main(String[] args){
  2.                   String s1 = new String("amit"); //这里在堆内存中开辟了"amit"的内存,在栈内存开辟内存存储s1对象引用
  3.                   System.out.println(s1.replace('m','r')); //字符串操作
  4.                   System.out.println(s1);
  5.                   String s3 = "arit";// 该种形式,声明新的内存区域,放在字符串池中
  6.                   String s4 = "arit"; //该种形式,会先去字符串池中查找"arit"是否存在,如果存在就直接调用,不用开辟空间;不存在,再开辟空间,同时放到字符串池中。
  7.                   String s2 = s1.replace('m','r');//把s1中存放的内存地址传递给s2,并对字符串“amit”进行字符串操作
  8.                   System.out.println(s2);
  9.                   System.out.println(s2 == s3);//s2与s3中存放的是不一样的内存地址,所以会false
  10.                   System.out.println(s3 == s4);//s3与s4调用的都是字符串中的相同的地址,所以true
  11.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为String s2 = s1.replace('m','r');且String s1 = new String("amit"); S2指向的是堆中的对象(有一块地址值)
String s3 = "arit"; 指向的字符池中(另外一块地址值),他们的内容一样但是地址不一样,==比较的是他们的地址值
比较内容的话应该用equals()方法


回复 使用道具 举报
黑马王建伟 发表于 2012-8-22 16:30
直接代码中加注释,楼主看吧

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