黑马程序员技术交流社区

标题: String类的一个小问题。 [打印本页]

作者: 1017161726    时间: 2015-6-6 14:55
标题: String类的一个小问题。
看到一段代码:
       public static void main(String[] args) {
               String s1 = "a";
               String s2 = "b";
               String s3 = "ab";
               System.out.println(s3 == s1 + s2);     // false
               System.out.println(s3 == "a" + "b");  // true,常量的运算会在编译期间就计算,所以"a"+"b"在编译后就是"ab"
          }
对于第二个打印结果,还可以理解,两个字符串拼接成新字符串,内存中已存在,不新建,而是直接引用。
这第一个打印结果,原理是什么,s1+s2最后是组成了字符串"ab",返回false肯定是不相等,那就是代表在内存中新建了字符串。
主要是为什么新建了。
求解::::::::::

作者: z171422696    时间: 2015-6-6 20:14
:lol主要是S1和S2是引用,不会在编译期计算!
作者: z171422696    时间: 2015-6-6 20:16
z171422696 发表于 2015-6-6 20:14
主要是S1和S2是引用,不会在编译期计算!

引用在栈内存中,是指向堆内存中的东西,你只是告诉了jvm引用,在编译时期jvm是不知道它指向什么的
作者: 黯然残影    时间: 2015-6-6 21:25
s1和s2是俩个引用,JVM并不知它的值
作者: 少年闰土    时间: 2015-6-7 00:44
s1+s2是在运行时计算的,所以会在栈中开辟内存存放“ab”,而s3则在编译时确定的“ab”在静态存储区,而==比较的是引用的地址,所以不相等,是false
作者: LoveMyself    时间: 2015-6-7 01:36
赞一下楼上
作者: 君子无醉    时间: 2015-6-7 03:00
z171422696 发表于 2015-6-6 20:14
主要是S1和S2是引用,不会在编译期计算!

不在编译期运算,但是运行期呢?而且结果是在虚拟机运行完之后才给的。。
作者: 君子无醉    时间: 2015-6-7 03:02
少年闰土 发表于 2015-6-7 00:44
s1 s2是在运行时计算的,所以会在栈中开辟内存存放“ab”,而s3则在编译时确定的“ab”在静态存储区,而==比 ...

赞一个!
作者: 邱石    时间: 2015-6-7 06:29
==比较的是引用值(地址值),s3和s1+s2是两个不同的引用值,所以返回结果是错的。




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