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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 灵枫 中级黑马   /  2014-9-19 16:32  /  1446 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

   String a="ddd"+"";
  String b="ddd";
  System.out.println("1  a==b "+(a==b));//true
  String s="";
  String c="eee"+s;
  String d="eee"+s;
  System.out.println("2  c==d "+(c==d));//false
  String A="aaa";
  String B="aaa";
  System.out.println("3  A==B "+(A+""==B));//false
你们心中的答案是否跟运行结果一样呢,能说出为什么吗?

点评

这类题现在论坛上已经讨论烂了,算不上什么底层技术了  发表于 2014-9-19 16:59

15 个回复

倒序浏览
好吧,表示我很少看此论坛的帖子
回复 使用道具 举报
学习下 真不知道
回复 使用道具 举报
我也不知道···
回复 使用道具 举报
在张孝祥老师视频关于空中网面试题的第三题就涉及到了这个问题
"ddd"+""编译器会自动进行优化,将其连接起来
"ddd"+s由于s是一个变量,所以编译不会自动连接,而在运行时才执行+操作
回复 使用道具 举报
darkads 发表于 2014-9-20 11:08
在张孝祥老师视频关于空中网面试题的第三题就涉及到了这个问题
"ddd"+""编译器会自动进行优化,将其连接起 ...

String A="aaa";
   String B="aaa";
   System.out.println("3  A==B "+(A+""==B));//false
但是直接在输出语句这里为什么不能true?

回复 使用道具 举报
灵枫 发表于 2014-9-20 12:52
String A="aaa";
   String B="aaa";
   System.out.println("3  A==B "+(A+""==B));//false

A也是一个引用变量,在编译器编译过程中,“aaa”这个值还没有赋给A,所以A+""编译不会优化,那么编译器就会认为A+""是一个不同的对象,会给他一个新的引用,==比较的是引用地址,而不是内容,所以返回false
回复 使用道具 举报
灵枫 中级黑马 2014-9-20 23:16:11
8#
darkads 发表于 2014-9-20 18:46
A也是一个引用变量,在编译器编译过程中,“aaa”这个值还没有赋给A,所以A+""编译不会优化,那么编译器 ...

你说的这个一点都不挂勾,现在这里就已经不是编译器自动优化的问题了,"aaa"已经赋值给A了,如果是"aaa"+""的这种情况,编译器会把后面不是引用变量的空字符串去除。现在的问题是String内部由StringBuilder的append(String str)方法的添加字符串问题,在A+""这过程其实是new StringBuilder()开辟了新内存地址,返回新字符串
回复 使用道具 举报
灵枫 发表于 2014-9-20 23:16
你说的这个一点都不挂勾,现在这里就已经不是编译器自动优化的问题了,"aaa"已经赋值给A了,如果是"aaa"+ ...

字符串串联是通过StringBuilder或者StringBuffer实现的,但是字符串是一个常量,一旦被创建,它的值就不能被更改,所以字符串串联的结果会产生一个新的字符串对象
回复 使用道具 举报 1 0
LFW 中级黑马 2014-9-21 17:15:18
10#
不是很明白为什么。。。来个大神具体解释下呗。版主快来
回复 使用道具 举报
可以调试看下到底进入哪块语句
回复 使用道具 举报
灵枫 发表于 2014-9-20 12:52
String A="aaa";
   String B="aaa";
   System.out.println("3  A==B "+(A+""==B));//false

其实这就是个区分“编译时”和“运行时”的问题。像"ddd" + ""是编译时即可确定的常量表达式,它跟"ddd"的值一样,而java语言规范规定,相同的String常量必须指向同一个String对象,因此第一组a==b为true。而后两组的c、d、A+""都不是编译时常量,必须到运行时在堆中去创建新对象
回复 使用道具 举报
darkads 发表于 2014-9-21 12:33
字符串串联是通过StringBuilder或者StringBuffer实现的,但是字符串是一个常量,一旦被创建,它的值就不 ...

这次你的回复我还是能接受的
回复 使用道具 举报
fantacyleo 发表于 2014-9-21 17:36
其实这就是个区分“编译时”和“运行时”的问题。像"ddd" + ""是编译时即可确定的常量表达式,它跟"ddd" ...

嗯,运行时的字符串串联
回复 使用道具 举报
版主,那就解释清楚些,我们都受教一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马