String相等面试题

87 阅读1分钟

字符串是我们编程中最为常见的数据类型,因此就有了下面的面试题,题目如下:

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

下面我们分析一下原理

image.png

前提知识: 首先我们要清楚变量在内存中分配的位置,如上图。常量分配在常量池中,如果有相同的常量值,是可以复用的(目的是节省空间)。

第一个输出:true

两个常量str1 和 str3 的值是一样,所以两者地址是相等的

第二个输出: false

我们可以看下该class文件里面的内容 首先 我们要将class文件里面的内容打印处理,我们可以使用一下命令

 javap -verbose StringUtil.class

输出结果 我们看下

image.png

从字节码文件里面我们可以看到,字符串拼接通过创建一个StringBuilder 进行字符串拼接的。我们知道运行时创建对象是分配在堆空间里面的,他们两个的地址值都是指向常量池中的字符串的。所以两者的对象的地址是不一样的。

第二个输出: true

我们先看下 intern()的API描述

image.png

通过注释我们看到这个方法是拿到字符串的值。因为str11 和 str13 都是指向常量池中的”helloworld“,所以两者是相等的。

以上就是String相等面试题的验证,如有不足请指正。