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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈圳 高级黑马   /  2013-5-2 15:05  /  1431 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈圳 于 2013-5-2 17:13 编辑
  1. public Test{
  2.                 public static void main(String[] args){
  3.     Stirng hello="Hello",lo="lo";
  4.     System.out.println((hello==("Hel"+"lo"))+" ");
  5.     System.out.println((hello==("Hel"+lo))+" ");
  6. }
复制代码
为什么结果会有差异?请高人分析运行过程

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
System.out.println((hello==("Hel"+"lo"))+" ");//在stringpool创建的常量,在编译期就已经确定
System.out.println((hello==("Hel"+lo))+" ");//lo要在运行期才能确定,而且是在堆中创建
回复 使用道具 举报
张熙韬 发表于 2013-5-2 15:31
陈圳童鞋有问题,太难得了,这个必须挤时间交流下!先占座,后答题!

没啥...The Java® Language Specification 3.10.5. String Literals 里面的示例...我文化低,看不懂英文...
回复 使用道具 举报
第一句: “hel” + "lo" 。在编译时期就可以确定下来。直接引用常量池中的"hello"
第二句:“hel”+lo。 由于lo是普通变量,编译器不会执行宏替换。
                   所以不能在编译器时期确定下来。不能直接引用常量池中的"hello"
              如果lo这样定义: final String lo = "lo" 的话。 这样编译器就会执行宏替换。
              就引用常量池中的"hello"。结果也就是输出true。
回复 使用道具 举报
本帖最后由 余威宏 于 2013-5-2 20:28 编辑

首先,==的作用是比较对象的值是否相等,如果相等返回true,否则返回false;当两边的对象属于引用数据类型时,==的作用是判断对象的内存地址是否一致,如果同时指向同一地址,则返回true,否则返回false.
第一句  Stirng hello="Hello",lo="lo";     // 在string pool中产生了 hello,lo 这样的常量字符串。
第二句    System.out.println((hello==("Hel"+"lo"))+" ");   //左边是变量hello=“hello”,由于右边"Hel"+"lo"加号连接起来后为"hello" ,所以左边跟右边两个都指向了String pool中"hello" ,指向的为同一个对象。打印结果为trule。
第三句    System.out.println((hello==("Hel"+lo))+" ");   //这个由于右边"Hel"+lo 中有个变量lo,这个时候一个是String pool中的对象,一个为堆中的对象,它们所指向的对象不同。 打印结果为false。
希望我的回答能让楼主明白。

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