字符串是我们编程中最为常见的数据类型,因此就有了下面的面试题,题目如下:
public class StringUtil {
public static void main(String[] args) {
String str1 = "helloworld";
String str3 = "hello" + "world";
System.out.println(str1==str3);
String str11 = "helloworld";
String str12 = "hello";
String str13 = str12 + "world";
System.out.println(str11==str13);
System.out.println(str11==str13.intern());
}
}
//结果
true
false
true
下面我们分析一下原理
前提知识: 首先我们要清楚变量在内存中分配的位置,如上图。常量分配在常量池中,如果有相同的常量值,是可以复用的(目的是节省空间)。
第一个输出:true
两个常量str1 和 str3 的值是一样,所以两者地址是相等的
第二个输出: false
我们可以看下该class文件里面的内容 首先 我们要将class文件里面的内容打印处理,我们可以使用一下命令
javap -verbose StringUtil.class
输出结果 我们看下
从字节码文件里面我们可以看到,字符串拼接通过创建一个StringBuilder 进行字符串拼接的。我们知道运行时创建对象是分配在堆空间里面的,他们两个的地址值都是指向常量池中的字符串的。所以两者的对象的地址是不一样的。
第二个输出: true
我们先看下 intern()的API描述
通过注释我们看到这个方法是拿到字符串的值。因为str11 和 str13 都是指向常量池中的”helloworld“,所以两者是相等的。
以上就是String相等面试题的验证,如有不足请指正。