首页 > 技术文章 > 字符串相关面试题剖析

gaopengpy 2020-07-24 16:36 原文

字符串是面试经常被问到的问题,需要正确理解字符串常量池,才能答好这类问题。

 

public class Test {

    public static void main(String[] args) {
        String s1 = "hello world";
        String s2 = "hello world";

        String a = "hello";

        String s3 = new String(a + " world");
        String s4 = new String(a + " world");

        System.out.println("s1 == s2: " + (s1 == s2));
        System.out.println("s2 == s3: " + (s2 == s3));
        System.out.println("s3 == s4: " + (s3 == s4));

        s3.intern();
        System.out.println("s2 == s3: " + (s2 == s3));

        s3 = s3.intern();
        System.out.println("s2 == s3: " + (s2 == s3));

    }
}

 

运行结果:

s1 == s2: true
s2 == s3: false
s3 == s4: false
s2 == s3: false
s2 == s3: true

 

解析:
【s1 == s2: true】:因为s1、s2都指向字符串常量池中同一字符串:hello world
【s2 == s3: false】:因为s2是指向字符串常量池中的引用,s3是指向堆中的引用,自然不相等
【s3 == s4: false】:因为s3、s4是两个不同的对象,自然不相等
【s2 == s3: false】:因为s3虽然调用了intern方法,但是未处理返回值,所以s3依然是指向堆中的引用
【s2 == s3: true】:因为s3调用了intern方法,并且返回给了s3,此时 s2、s3 都直接指向常量池的同一个字符串

推荐阅读