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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 伍仪华 黑马帝   /  2011-7-31 11:16  /  2715 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String a = "abc";
String b = "abc";
System.out.println("====>"+ a==b );

请问输出结果是true还是false?

评分

参与人数 1技术分 +2 收起 理由
admin + 2 问得好!

查看全部评分

10 个回复

倒序浏览
黑马网友  发表于 2011-7-31 11:17:48
沙发
太邪恶了  居然是false

评分

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

查看全部评分

回复 使用道具 举报
首先String不属于8种基本数据类型,String是一个对象。
字符串常量  存储在常量池中 ,先看下面的2个例子:[code=java]String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );[/code]结果为:[code=java]true
true[/code]因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。 所以我们得出s0==s1==s2;[code=java]String s0=”kvill”;
String s1=new String(”kvill”);
String s2=”kv” + new String(“ill”);
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );[/code]结果为:[code=java]false
false
false[/code]s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分new String(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。

此题还有就是运算符的优先级得问题:字符串连接符的优先级    比  ==  高
"====>"先和a 连接    再和 b  计较
不知道你明白没?
[ 本帖最后由 毕仁杰 于 2011-07-31  11:39 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 很用心!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-31 11:42:58
板凳
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-31 11:50:17
报纸
这个考了好几个知识点
回复 使用道具 举报
黑马网友  发表于 2011-7-31 11:51:27
地板

回复 沙发 的帖子

都说了,你看看题目
回复 使用道具 举报
黑马网友  发表于 2011-7-31 11:55:28
7#
肯定是false啦,因为String是引用类型,a和b 相当于在内存中分配了两个地址,两份空间,a和b得地址引用存放在内存的栈中  实际的数据存放在内存堆中,只不过a和b存放的实际数据一样而已,实际上市两个对象,两个空间,所以肯定是falsed了.

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分!

查看全部评分

回复 使用道具 举报
李海涵 黑马帝 2011-7-31 11:58:21
8#

回复 7 # 的帖子

不对吧  

如果是两个空间,你试试
System.out.println(a==b);  呢??应该怎么解释呢
[ 本帖最后由 李海涵 于 2011-07-31  11:59 编辑 ]
回复 使用道具 举报
+号的优先级高于==
回复 使用道具 举报
黑马网友  发表于 2011-8-1 08:02:09
10#
这个是运算符的优先级问题,因为+的优先级高于==
所以题目中的("====>"+ a==b)相当于====>和a连接后(====>abc)在和
b进行比较,这时两个字符串不相等了,所以结果是fales
回复 使用道具 举报
黑马网友  发表于 2011-8-1 18:46:53
11#
[quote] 原帖由 [i]鄢甲力[/i] 于 2011-07-31 11:55 发表 [url=http://bbs.itheima.com/redirect.jsp?goto=findpost&pid=6519&ptid=864][img]http://bbs.itheima.com/images/common/back.gif[/img][/url]肯定是false啦,因为String是引用类型,a和b 相当于在内存中分配了两个地址,两份空间,a和b得地址引用存放在内存的栈中  实际的数据存放在内存堆中,只不过a和b存放的实际数据一样而已,实际上市两个对象,两个空间,所以肯定是falsed了. [/quote]

我的理解是,栈内存中的a和b中所存放的是两个String对象在堆内存中的首地址,所以他们是不一样的,这才造成 a==b 返回false,而对内存中的两个“abc”对象的内容是一样的,所以a.equals.(b)值应该为true。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马