JVM 为了提高性能和减少内存开销,实现数据共享,所以引入了字符串常量池。字符串常量池存在于方法区当中,创建字符串常量时,首先判断字符串是否存在于常量池当中,如果存在则直接返回该实例的引用,如果不存在则实例化该字符串放入池中再返回引用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    public static void main(String args[]) {
        String s1 = "Cat";
        String s2 = "Cat";
        // 在堆内存中创建一个 "Cat" 对象
        String s3 = new String("Cat");
        // intern() 会将创建的 String 放入常量池
        // 如果该常量已经存在则返回常量池中已存在的常量
        String s4 = new String("Cat").intern();
        // true
        System.out.println(s1 == s2);
        // false
        System.out.println(s1 == s3);
        // true
        System.out.println(s1 == s4);
    }