黑马程序员技术交流社区
标题:
字符串的链接比较
[打印本页]
作者:
丁朋伟
时间:
2011-9-19 11:16
标题:
字符串的链接比较
String s1 = "Java";
String s2 = "Ja"+"va";
String str1 = "Ja";
String str2 = "va";
String str3 = str1 + str2;
System.out.println(s1==s2);
System.out.println(s1==str3);
System.out.println(s1.equals(str3));
输出
true
false
true
我知道==是表示的是值相等,equals表示的是引用对象,但是到这里我不能解释的明白
求高手指点下
作者:
匿名
时间:
2011-9-19 11:54
给你断点了一下
s1 java
s2 java
str1 ja
str2 va
str3 java
就说false 的输出吧 value显示 s1为 char 4 id 32 s2也一样
str3为 char4 id 34 这是
=- = 无比蛋疼 检查不出来 我想因该和 == 和equals有关系吧 equals更注重的是 字符串比较
==因该和equals有区别
作者:
匿名
时间:
2011-9-19 11:56
其实你可以这样来理解:
在内存里s1,s2指向同一个地址,str3指向的是str1和str2这两个地址,equals是比较两个值是否相等,而==不但要比较两个值是否相等,还比较他指向的地址是否相等。
作者:
匿名
时间:
2011-9-19 11:59
恩 楼上的说的不错 断点里的 s1 s2 id是32 而str3 是34
作者:
匿名
时间:
2011-9-19 12:19
[quote] 原帖由 [i]ila123[/i] 于 2011-09-19 11:56 发表 [url=http://bbs.itheima.com/redirect.jsp?goto=findpost&pid=10195&ptid=1605][img]http://bbs.itheima.com/images/common/back.gif[/img][/url]其实你可以这样来理解:
在内存里s1,s2指向同一个地址,str3指向的是str1和str2这两个地址,equals是比较两个值是否相等,而==不但要比较两个值是否相等,还比较他指向的地址是否相等。 [/quote]
顶顶,
作者:
匿名
时间:
2011-9-19 13:25
以前记得是==比较的是两个值,equals比较的是地址的引用,到底是怎么个情况???:(
作者:
匿名
时间:
2011-9-19 15:20
标题:
回复 楼主 的帖子
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等.
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true.而在比较引用时,如果引用指向内存中的同一对象,结果为true.
基本上按上面的理解就行了,但是楼主给出的例子有点特殊,可能就把你弄混淆了.
例子中的变量全是引用类型,所以==用于比较引用是否指向同一内存中的对象.
例子中的s1中的"Java"是字符串常量,在编译期就被确定了,这样在常量池中就有了"Java"这个常量.
而s2中的"Ja"和"va"也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2在编译期就被解析为一个字符串常量,s2="Java".但是这个时候,常量池中已经存在"Java"这个字符串了,那么s2就指向常量池中的"Java",所以s2也是常量池中"Java"的一个引用.则s1==s2为true就好理解了.
s1还是常量池中"Java"的引用,而str3为str1和str2两个变量得来的,所以无法在编译期确定str3的值,因此str3是运行时创建的新对象"Java"的引用,str3并不是常量池中"Java"的引用,所以s1==str3为false也不难理解了.
equals用来判断两个对象的内容是否相等,所以s1.equals(str3)为true也顺理成章.
作者:
匿名
时间:
2011-9-19 16:07
感谢楼上介绍,受益匪浅:handshake
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2