黑马程序员技术交流社区

标题: 谈一谈最常用的Sring类,底层技术性问题 [打印本页]

作者: 灵枫    时间: 2014-9-19 16:32
标题: 谈一谈最常用的Sring类,底层技术性问题
   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 17:44
好吧,表示我很少看此论坛的帖子
作者: 谢建平    时间: 2014-9-20 01:18
学习下 真不知道
作者: i19920412    时间: 2014-9-20 10:44
我也不知道···
作者: darkads    时间: 2014-9-20 11:08
在张孝祥老师视频关于空中网面试题的第三题就涉及到了这个问题
"ddd"+""编译器会自动进行优化,将其连接起来
"ddd"+s由于s是一个变量,所以编译不会自动连接,而在运行时才执行+操作
作者: 灵枫    时间: 2014-9-20 12:52
darkads 发表于 2014-9-20 11:08
在张孝祥老师视频关于空中网面试题的第三题就涉及到了这个问题
"ddd"+""编译器会自动进行优化,将其连接起 ...

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


作者: darkads    时间: 2014-9-20 18:46
灵枫 发表于 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
darkads 发表于 2014-9-20 18:46
A也是一个引用变量,在编译器编译过程中,“aaa”这个值还没有赋给A,所以A+""编译不会优化,那么编译器 ...

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

字符串串联是通过StringBuilder或者StringBuffer实现的,但是字符串是一个常量,一旦被创建,它的值就不能被更改,所以字符串串联的结果会产生一个新的字符串对象
作者: LFW    时间: 2014-9-21 17:15
不是很明白为什么。。。来个大神具体解释下呗。版主快来
作者: zhumy111    时间: 2014-9-21 17:19
可以调试看下到底进入哪块语句
作者: fantacyleo    时间: 2014-9-21 17:36
灵枫 发表于 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+""都不是编译时常量,必须到运行时在堆中去创建新对象
作者: 灵枫    时间: 2014-9-21 20:29
darkads 发表于 2014-9-21 12:33
字符串串联是通过StringBuilder或者StringBuffer实现的,但是字符串是一个常量,一旦被创建,它的值就不 ...

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

嗯,运行时的字符串串联
作者: libo1989329    时间: 2014-9-21 20:47
版主,那就解释清楚些,我们都受教一下




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