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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小丑的媳妇2 中级黑马   /  2013-3-12 12:56  /  2038 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 朱荣宁. 于 2013-3-13 10:30 编辑

今天看打一个简单的Java代码,如下;
String a = "abc";
String b = "abc";
System.out.println("====>"+ a==b );
高手看一下,结果是什么?我知道结果,但是不知道原因!菜鸟啊,唉

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

12 个回复

倒序浏览
本帖最后由 丁一 于 2013-3-12 13:07 编辑

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

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

结果是====>false
回复 使用道具 举报
String a = "abc";
String b = "abc";
System.out.println("====>"+ a==b );true
字符串在内存里面有个常量池,池里面有个数组,数组用来存取abc字符,再次创建池中已经有与abc相同的就不会创建了,所以a b都指向abc
回复 使用道具 举报
本帖最后由 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。
希望对你有帮助!!!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
特意运行了一下  结果是    ====>false
System.out.println("====>"+ a==b );

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

评分

参与人数 1黑马币 +12 收起 理由
谢洋 + 12 实验是最好的证明!

查看全部评分

回复 使用道具 举报
优选及不熟悉啊
回复 使用道具 举报
你要明确这个问题
System.out.println("====>"+(a==b) );//这个是true
与System.out.println(("====>"+ a)==b );//这个是false
是不同的
回复 使用道具 举报
这个还是运算符的优先级问题,最后简化后就是""+a==b;在百度百科中搜索运算符优先级可以得到资料
运算符优先级
按优先级从高到低排列如下:[ ] ( ) ++ -- ! ~ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op= 。
显而易见,+的优先级大于==,故先执行左边的""+a;最终输出结果为false;

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
+号优先级高于==号
回复 使用道具 举报
  1. String a = "abc";
  2.                 String b = "abc";
  3.                 System.out.println("====>" + (a == b));
复制代码
不废话,你原来的代码结果是false,而且只有一个false

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

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

希望能帮到你,加油哦!!!
回复 使用道具 举报
到底hi对还是错??{:soso_e101:}
回复 使用道具 举报
不会大神们那么专业 通俗点讲吧
System.out.println("====>"+ a==b )
优先级顺序问题
                 一元                                 +- ++ -[其余的]
              算术(和移位)       * / % + - << >>
               关系                            > < >= <= == !=
              逻辑(和按位)       && || & / ^
               :条件(三元)     A>B?X:Y
                赋值                        =(以及复合赋值,如*=)
回复 使用道具 举报

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马