黑马程序员技术交流社区

标题: 这道题真邪恶,嘎嘎,听说是某个公司的面试题, [打印本页]

作者: 李方哲    时间: 2011-9-27 16:46
标题: 这道题真邪恶,嘎嘎,听说是某个公司的面试题,
[code=java]String a = "abc";
String b = "abc";
System.out.println("====>"+ a==b ); [/code]
结果是ture还是False呢,
这个题我编译了,你们猜一下再编译哦,太邪恶了,
这几天闲下来的时候就喜欢找点邪恶的代码,挺有意思的,算是业余活动了,你们也试试,?很开心的说,
作者: 匿名    时间: 2011-9-27 17:03
必然性是 false, 不用运行也知道 ..
作者: 许晨峰    时间: 2011-9-27 17:05
String类型的某些字符串是否应用到享元模式,本来我不得而知的,当时我写享元模式这篇文章(http://blog.sina.com.cn/s/blog_7597caf00100tjbr.html)时,也遇到过像楼主这样的问题,后来查阅资料,才知道Java运行环境有个字符串连接池,它和jndi是不同的,jndi一开始就创建很多个连接放入池子中,需要的时候直接去拿出来,而这个字符串连接池的机制是:当你创建的时某个字符串对象的时候才将这个字符串放入到池子中,比如像楼主的这个例子,第一次创建了个字符串为“abc”的a对象,放入池中,第二次创建相同字符串的b对象,当jvm发现字符串连接池中有这个字符串的时候,就去池中拿出这个字符串赋给b对象。因此这里输出为true。



回复底下几楼,失误失误。没看清楚题目直接答题了,光看到比较了,忘记前面还有个"=====>",因为平常经常性测bug,会在代码中输入符号之类的,导致今天看到了却不以为然,还以为光只有比较,忘记前面还有个运算符的操作,罪过!以后要注意了!

[ 本帖最后由 许晨峰 于 2011-09-28  00:30 编辑 ]
作者: 匿名    时间: 2011-9-27 17:15
楼上解释一大堆,但是却是错误的结果。
这题靠的时 运算符的优先级。
在sun公司的java标准中有个例子
System.out.println("a"+3+4);
System.out.println(3+4+"a");
作者: 匿名    时间: 2011-9-27 17:24
结果当然是false,因为“==”表示比较的是值,s2和s1的地址值是不一样的。
作者: 匿名    时间: 2011-9-27 17:29
恩,其实还有个知识点,就是运算符优先级,这两个点看到哪一个都能说对,嘿嘿,
作者: 匿名    时间: 2011-9-27 18:07
是false ,这是必须 的: 因为“==”   是用来比较字符串常量的  而不是变量   变量用.equal()
作者: 匿名    时间: 2011-9-27 18:29
false   比较的不是a,b所赋值的内容是他们的地址值
作者: 匿名    时间: 2011-9-27 19:05
唉~~~看着楼上一个个的回答,真是令人揪心啊~~~:L
作者: 匿名    时间: 2011-9-27 20:34
我们平时在用等号用的最多的地方是什么??在没学java之前。
就是比较2个数值是否相等 而数值在java中是什么类型 应该是原始类型 也就说是int byte long。。。。
string是java中的系统类 二个类相等能用等号去差别吗?? 判断二个对象是否相等 就是判断对象在栈内存中的地址值是否相等  因为地址值在内存中是唯一的!
作者: 匿名    时间: 2011-9-27 20:53
标题: 回复 板凳 的帖子
板凳靠谱,这种题要弄成选择题或者判断题,真是冤枉好多人啦,两个知识点只知道一个,还不如一个都不知道呢
作者: 匿名    时间: 2011-9-27 20:55
看着回帖有点晕,谁来个稳点的
作者: 匿名    时间: 2011-9-27 21:06
太邪恶了,太邪恶了
作者: 匿名    时间: 2011-9-27 21:07
"====>"+ a==b哈哈,确实有点好玩,如果没有前面的那一串,就是true了,或者后面两个比较用括号括起来也会有true,这道题相当于先算"====>"+ a,算出来应该是"====>abc",而b="abc",这时候应该可以看出来是false了。
作者: 匿名    时间: 2011-9-27 21:49
你们难道都没看到少了括号吗??
作者: 匿名    时间: 2011-9-27 21:50
标题: 回复 14 # 的帖子
实验结果与LS一样:victory:
作者: 匿名    时间: 2011-9-27 22:15
结果 true,String类是final的,==比较的是对象
作者: 匿名    时间: 2011-9-27 23:23
上面这题比较的是这两个字符串:"====>"+ a 和b
所以答案肯定是false
作者: 郭运明    时间: 2011-9-28 15:30
他们指向的不同对象 用== 就是false ,如果是equal 的话就true


----------------------------------------------------------------
上面我第一次的理解错了,看了上面的人我才弄明白,这里有个小陷阱吧 “====》”+a==b其实是(“====》”+a)== (b),答案就是fasle,单就a==b是true,就如上面仁兄所说,在字符串连接池先有“abc”指向a,当对b进行赋值的时候在连接池中有“abc”,就把这个“abc”复制给b,所以a,b指向的是同一对象,a==b就是true.用equals更是如此。不知道我还有没有理解错误,欢迎大家给我指出来:lol
[ 本帖最后由 郭运明 于 2011-09-28  17:19 编辑 ]
作者: 匿名    时间: 2011-9-28 15:41
其实很多人都把问题放在了 “==”
其实这道题考的是加了 “"=====>" +”这句话以后 运算优先级发生了变化!
看到后面有同学也讲出来了,自夸一下,我绝对没有看下面的介绍想到这个问题的!~谢谢!~~
作者: 匿名    时间: 2011-9-28 18:39
String a = "abc";  
String b = "abc";  
System.out.println("====>"+ a==b );

对于这个问题,答案是true
为什么?第一行代码创建了一个对象 (String pool)  String内部会把内容为"abc"放进String pool(String池)并且让a指向"abc"
对于第二行代码,String会去检查String Pool有没有"abc"的对象,发现有那么就不创建对象了,直接让b指向"abc"
所以a和b指向的是同一个内存地址,更加详细的信息可以查看String 的API
作者: 匿名    时间: 2011-9-30 12:47
我新来的,我是来学习一下的.看上面的兄弟们都给出答案了.
作者: 匿名    时间: 2011-9-30 20:29
这道题太邪恶了,弄个运算符 搞成了 ====>a和b比较
作者: 郭学文    时间: 2011-10-6 22:49
{:soso_e103:}  是比较邪恶,惯性思维在作怪。

System.out.println("===>"+(a==b));   打印的结果是 ====>true
System.out.println("===>"+a==b);      打印的结果是 false  而不是====>false
作者: 张校云    时间: 2011-10-7 00:07
邪恶的一道题




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2