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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 1017161726 中级黑马   /  2015-6-6 14:55  /  284 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看到一段代码:
       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肯定是不相等,那就是代表在内存中新建了字符串。
主要是为什么新建了。
求解::::::::::

8 个回复

倒序浏览
:lol主要是S1和S2是引用,不会在编译期计算!
回复 使用道具 举报
z171422696 发表于 2015-6-6 20:14
主要是S1和S2是引用,不会在编译期计算!

引用在栈内存中,是指向堆内存中的东西,你只是告诉了jvm引用,在编译时期jvm是不知道它指向什么的
回复 使用道具 举报
s1和s2是俩个引用,JVM并不知它的值
回复 使用道具 举报
s1+s2是在运行时计算的,所以会在栈中开辟内存存放“ab”,而s3则在编译时确定的“ab”在静态存储区,而==比较的是引用的地址,所以不相等,是false
回复 使用道具 举报
赞一下楼上
回复 使用道具 举报
君子无醉 来自手机 中级黑马 2015-6-7 03:00:36
7#
z171422696 发表于 2015-6-6 20:14
主要是S1和S2是引用,不会在编译期计算!

不在编译期运算,但是运行期呢?而且结果是在虚拟机运行完之后才给的。。
回复 使用道具 举报
君子无醉 来自手机 中级黑马 2015-6-7 03:02:31
8#
少年闰土 发表于 2015-6-7 00:44
s1 s2是在运行时计算的,所以会在栈中开辟内存存放“ab”,而s3则在编译时确定的“ab”在静态存储区,而==比 ...

赞一个!
回复 使用道具 举报
邱石 来自手机 中级黑马 2015-6-7 06:29:35
9#
==比较的是引用值(地址值),s3和s1+s2是两个不同的引用值,所以返回结果是错的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马