黑马程序员技术交流社区
标题:
string对象比较
[打印本页]
作者:
一直很安静
时间:
2013-11-18 13:12
标题:
string对象比较
String s1=new String("abc");
String s2=new String("abc");
System.out.println (s1==s2);结果为什么是false?
作者:
wu_lesley
时间:
2013-11-18 13:31
在java中,这个代码即使在两个字符串完全相同的情况下也会返回false ;Java中必须使用string1.equals(string2)来进行判断。
如果写成下面的形式:
string s1="abc";
string s2="abc";
则(s1==s2)=true;因为它们指向同一个对象。
作者:
hel
时间:
2013-11-18 13:49
因为s1和s2是你new出来的对象,
也就是说他们在内存中的地址不同,因为是new出来的两个不同的对象,
s1==s2 是比较他们的内存中的地址,所以不同
如果换成 equal 的 他们就会相等,
因为equal在String类中是比较的他们对象中的数据的内容,
作者:
bpsend
时间:
2013-11-18 14:26
一个字符串创建后无法被改变,所以它可以被多个引用变量共用,它存在于方法区的常量池中。
使用直接赋值的方法:
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
作者:
mayor125
时间:
2013-11-18 15:13
s1和s2是通过new关键字实例化出来的两个不同的对象,尽管这两个对象的内容相同(都是abc),但是它们在堆内存中的地址是不一样的。
而
“==”比较的是堆内存的引用地址
,根据上面的说明就可以知道为什么输出结果是false了。
如果你想比较这两个对象的内容是否相等的话,可以通过调用String类型对象的equals();方法,即:
System.out.println(s1.equals(s2));
作者:
冯国强
时间:
2013-11-19 20:01
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的方法,比较的两个字符串对象的内容是否相同。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2