黑马程序员技术交流社区

标题: 求解:高手看看这个怎么解释 [打印本页]

作者: 小丑的媳妇2    时间: 2013-3-12 12:56
标题: 求解:高手看看这个怎么解释
本帖最后由 朱荣宁. 于 2013-3-13 10:30 编辑

今天看打一个简单的Java代码,如下;
String a = "abc";
String b = "abc";
System.out.println("====>"+ a==b );
高手看一下,结果是什么?我知道结果,但是不知道原因!菜鸟啊,唉
作者: 丁一    时间: 2013-3-12 13:00
本帖最后由 丁一 于 2013-3-12 13:07 编辑

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

先"====>"+ a  了 后再和b 做判断 是否相等

结果是====>false
作者: 张卫刚    时间: 2013-3-12 13:09
String a = "abc";
String b = "abc";
System.out.println("====>"+ a==b );true
字符串在内存里面有个常量池,池里面有个数组,数组用来存取abc字符,再次创建池中已经有与abc相同的就不会创建了,所以a b都指向abc
作者: 谢辉林    时间: 2013-3-12 13:21
本帖最后由 laughing 于 2013-3-12 13:33 编辑

String a="abc";
Sting b="abc";
System.out.println("====>"+ a==b ;
结果是true;
原因:
String a = "abc";你定义这样一个变量的时候,java此时先会去常量池寻找有没有"abc"这样的字符串,如果有,直接把内存地址交给a, 否则就生成一个"abc"的字符串当下一个String b = "abc";的时候,发现常量池已经有"abc"了,此时JVM不会再次生成"abc",而是直接交给"abc"引用给b, 所以此时你会发现a == b。
希望对你有帮助!!!
作者: 丁一    时间: 2013-3-12 13:23
特意运行了一下  结果是    ====>false
System.out.println("====>"+ a==b );

先"====>"+ a  结果为   ====> a
后再和b 做判断 是否相等

作者: 谢洋    时间: 2013-3-12 13:29
优选及不熟悉啊
作者: Benwolf0818    时间: 2013-3-12 13:31
你要明确这个问题
System.out.println("====>"+(a==b) );//这个是true
与System.out.println(("====>"+ a)==b );//这个是false
是不同的
作者: 沈文杰    时间: 2013-3-12 13:49
这个还是运算符的优先级问题,最后简化后就是""+a==b;在百度百科中搜索运算符优先级可以得到资料
运算符优先级
按优先级从高到低排列如下:[ ] ( ) ++ -- ! ~ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op= 。
显而易见,+的优先级大于==,故先执行左边的""+a;最终输出结果为false;
作者: 黑马-陈思源    时间: 2013-3-12 14:16
+号优先级高于==号
作者: HM马明宇    时间: 2013-3-12 14:53
  1. String a = "abc";
  2.                 String b = "abc";
  3.                 System.out.println("====>" + (a == b));
复制代码
不废话,你原来的代码结果是false,而且只有一个false

这是我给你改过之后的代码,一对比就很明显了:
改过之后的运行结果:====>true
你的代码表示 "====>"+a先运算,这时+是字符串连接符,会把a和 "====>"这个字符串连接起来的,然后才是和b进行==比较,所以结果很明显就是false了

代码的结果不能想当然,要按照严格的执行顺序去考虑,这样才不容易出错

希望能帮到你,加油哦!!!

作者: 小丑的媳妇2    时间: 2013-3-12 21:22
到底hi对还是错??{:soso_e101:}
作者: 安鹏宇    时间: 2013-3-13 00:57
不会大神们那么专业 通俗点讲吧
System.out.println("====>"+ a==b )
优先级顺序问题
                 一元                                 +- ++ -[其余的]
              算术(和移位)       * / % + - << >>
               关系                            > < >= <= == !=
              逻辑(和按位)       && || & / ^
               :条件(三元)     A>B?X:Y
                赋值                        =(以及复合赋值,如*=)

作者: 安鹏宇    时间: 2013-3-13 01:00

不会大神们那么专业 通俗点讲吧
System.out.println("====>"+ a==b )
优先级顺序问题
                 一元                                 +- ++ -[其余的]
              算术(和移位)       * / % + - << >>
               关系                            > < >= <= == !=
              逻辑(和按位)       && || & / ^
               :条件(三元)     A>B?X:Y
                赋值                        =(以及复合赋值,如*=)
这是由高到低排的,   算数运算符的优先级 要高于关系运算符
先算 + 号运算 再 ==
所以就是先算了  "====>"+ a  再用"====>"+ a和b进行比较  结果为false 不等于
如果"====>"+ (a==b)  先算  a==b 结果就为  true




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