@TOC
1.Java字符串常量池
Java中的字符串常量池在底层维护的是一个StringTable类,其本质上是一个固定大小的HashTable,在Java8中,字符串常量池位于堆上,并且它的大小是可以设置的,但是最小值为1009。而HashTable的底层维护的就是一个Hash表,实现字符串常量的存储和查找。
1.1 常量池底层图解
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关键字创建的字符串对象放入常量池中
例如:
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
}
}