(后面的面试题我们不考虑在执行代码之前常量池中已经存在了字符串这种情况。)
在虚拟机看到两个或者多个字面量直接相加的时候会对其进行优化直接生成一个字符串到常量池中。
为什么不是6个?不是还有一个ab吗?
使用引号包含文本的方式创建String对象之间使用"+"号连接,产生的对象会被加入到String常量池中,对于所有包含new方式创建的字符串对象的“+”号连接表达式,他所产生的新对象不会加入到常量池。
- public class Test {
- public static void main(String[] args) {
- String s1= "abcd";
- //在常量池创建一个"abcd"
- String s2= "ab"+"cd";
- /*两个字面量连接的时候先将两个字符串常量连接直接生成"abcd"之后
- 判断常量池中是否存在abcd存在则返回引用,否则保存到String常量池中。
- */
- System.out.println(s1==s2);
- }
- }
true
- package com.bai.demo;
-
- public class Test {
- public static void main(String[] args) {
- String s1= "abcd";
- String s2= "ab";
- String s3 ="cd";
- String s4=s2+s3;//两个相加在堆中
- System.out.println(s1==s4);
- }
- }
false
当多个字符串引用相加的时候堆中开辟的新空间,通过我们的分析,发现了str4最终的地址是在堆中,而str1是在常量池中,所以二者的地址是不相等的。使用new 都会在堆中开辟空间。