thefansofjay 2015-12-02 13:48 采纳率: 100%
浏览 5711
已结题

下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

答:对于如下代码:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。
题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,
String s ="a" + "b" + "c" + "d";
System.out.println(s== "abcd");
最终打印的结果应该为true。

这是JAVA面试题及答案,但不十分理解,谁能帮我解释一下,System.out.println(s2 == "ab");为什么返回false?

  • 写回答

5条回答 默认 最新

  • lb1120890227 2015-12-02 14:16
    关注

    栈内存中存放引用变量--S1,S2和S3,堆内存中存放的是对象--a,b,c和d;
    String s2 = s1 + "b",
    理解为引用地址和堆地址的联合;
    String s3 = "a" + "b",
    理解为堆地址和堆地址的联合,即堆中“ab”的地址,
    所以S2=“ab”为false;

    评论

报告相同问题?

悬赏问题

  • ¥15 msix packaging tool打包问题
  • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线