字符串是面试经常被问到的问题,需要正确理解字符串常量池,才能答好这类问题。
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 都直接指向常量池的同一个字符串