字符串常量池详解

365 阅读1分钟

@TOC

1.Java字符串常量池

Java中的字符串常量池在底层维护的是一个StringTable类,其本质上是一个固定大小的HashTable,在Java8中,字符串常量池位于堆上,并且它的大小是可以设置的,但是最小值为1009。而HashTable的底层维护的就是一个Hash表,实现字符串常量的存储和查找。

1.1 常量池底层图解

image.png


2.创建一个字符串常量

2.1 直接创建

  • 通过双引号包裹起来的方式创建的字符串,如果在常量池中不存在,就会直接放在字符串常量池中。否则直接使用常量池中的字符串。

例如:

class Main {
    public static void main(String[] args) {
        String str1 = "Java";               //在常量池中不存在,直接放入常量池中
        String str2 = "Java";               //常量池中存在“Java”,直接进行引用赋值
        System.out.println(str1 == str2);   //true
    }
}

2.2 通过String类的intern方法

  • 默认情况下使用new关键字创建的字符串对象位于堆上
  • 通过String类的intern方法可以将通过new关键字创建的字符串对象放入常量池中

image.png

例如:

class Main {
    public static void main(String[] args) {
        String str1 = new String("Java");
        String intern = str1.intern();     //字符串常量池中还没有"Java",于是将其入池,并返回一个入池后的新的引用
        String str2 = new String("Java");  //常量池中已经有了,放弃入池
        String str3 = "Java";              //常量池中已经有了,直接指向
        System.out.println(str1 == str2);  //false
        System.out.println(str1 == intern); //false
        System.out.println(str1 == str3);  //false
        System.out.println(intern == str3); //true
    }
}