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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁朋伟 黑马帝   /  2011-9-19 11:16  /  2233 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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表示的是引用对象,但是到这里我不能解释的明白
求高手指点下

评分

参与人数 1技术分 +1 收起 理由
admin + 1 这个题目问的人挺多的哦!

查看全部评分

7 个回复

倒序浏览
黑马网友  发表于 2011-9-19 11:54:31
沙发
给你断点了一下
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:18
藤椅
其实你可以这样来理解:
在内存里s1,s2指向同一个地址,str3指向的是str1和str2这两个地址,equals是比较两个值是否相等,而==不但要比较两个值是否相等,还比较他指向的地址是否相等。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-19 11:59:07
板凳
恩  楼上的说的不错  断点里的 s1  s2 id是32 而str3 是34
回复 使用道具 举报
黑马网友  发表于 2011-9-19 12:19:38
报纸
[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:37
地板
以前记得是==比较的是两个值,equals比较的是地址的引用,到底是怎么个情况???:(
回复 使用道具 举报
黑马网友  发表于 2011-9-19 15:20:52
7#

回复 楼主 的帖子

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:29
8#
感谢楼上介绍,受益匪浅:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马