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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一直很安静 中级黑马   /  2013-11-18 13:12  /  1141 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s1=new String("abc");
String s2=new String("abc");
System.out.println (s1==s2);结果为什么是false?

5 个回复

倒序浏览
在java中,这个代码即使在两个字符串完全相同的情况下也会返回false ;Java中必须使用string1.equals(string2)来进行判断。
如果写成下面的形式:
string s1="abc";
string s2="abc";
则(s1==s2)=true;因为它们指向同一个对象。
回复 使用道具 举报
hel 中级黑马 2013-11-18 13:49:24
藤椅
因为s1和s2是你new出来的对象,
也就是说他们在内存中的地址不同,因为是new出来的两个不同的对象,
s1==s2 是比较他们的内存中的地址,所以不同

如果换成 equal 的 他们就会相等,
因为equal在String类中是比较的他们对象中的数据的内容,
回复 使用道具 举报
一个字符串创建后无法被改变,所以它可以被多个引用变量共用,它存在于方法区的常量池中。
使用直接赋值的方法:
String str1 = "abc"; str1会到常量池中去找有没有abc这个字符串,发现没有则创建了一个,然后将引用返回给了str1。
String str2 = "abc"; str2到常量池中去找到了上一次str1创建的字符串abc,然后把字符串的引用返回给了str2
System.out.println(str1==str2); //所以它们引用是相等的。true。
--------------------------------------------------------------------------------------------

使用new关键字创建字符串实例:
String s1 = new String("abc");首先它会在常量池中创建一个abc,然后再堆中创建了一个String类型的对象,把池中的abc这个字符串的值(不是址)复制给这个对象。
String s2 = new String("abc");把池中的abc这个字符串的值(不是址)复制给这个对象。
System.out.println(s1==s2);  false ,引用地址不同
问题:以上共创建了几个对象?
3个,分别是abc、s1、s2


评分

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

查看全部评分

回复 使用道具 举报
s1和s2是通过new关键字实例化出来的两个不同的对象,尽管这两个对象的内容相同(都是abc),但是它们在堆内存中的地址是不一样的。

“==”比较的是堆内存的引用地址,根据上面的说明就可以知道为什么输出结果是false了。

如果你想比较这两个对象的内容是否相等的话,可以通过调用String类型对象的equals();方法,即:
System.out.println(s1.equals(s2));

评分

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

查看全部评分

回复 使用道具 举报
String s1=new String("abc");
String s2=new String("abc");
System.out.println (s1==s2);结果为什么是false?
解释:首先,前两句是定义两个字符串对象并实例化。由于在实例化时,会产生两个对象,由于字符串对象abc并不是存储在对象中,在常量池中,对象中的引用指向abc对象。而new String会产生两个封装对象并分配两个不同的哈希值,所以比较s1与s2是否相同,所以结果是false。
  若要比较内容相同,应使用String类中的equals方法,因为它重写了Object的方法,比较的两个字符串对象的内容是否相同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马