文章目錄
- 一.字符串常量池(StringTable)
- 1.1 定義
- 1.2 演示示例
- 1.3 intern方法
一.字符串常量池(StringTable)
1.1 定義
字符串常量詞本質是一個固定大小的HashTable。當用一個字符串構造String對象時,首先會去StringTable中查看是否存在在字符串,如果存在,返回該字符串的引用,如果不存在,將該字符串放入StringTabel并返回引用。
如果使用字符串常量去構造String對象,那么編譯器會自動放入String Table;
如果使用 new String(“str”) 去構造String對象,則首先會在堆上開辟一份空間,之后會去String Table拿str的引用(拿的規則如上),并給新開辟的空間。
如上為String類的成員,可以看到在String中并沒有直接存儲字符串,而只是通過byte數組存放每個字符。
1.2 演示示例
public class Test {public static void main(String[] args) {String str1="abc";String str2="abc";System.out.println(str1==str2); //true}
}
為什么以下內容為false?
public class Test {public static void main(String[] args) {String str1="abc";String str2="abc";System.out.println(str1==str2); //trueString str1=new String("abc");String str2=new String("abc");System.out.println(str1==str2); //false}
}
new會在堆上開辟空間,這個空間是返回給str的,這不是StringTable的空間,是系統分配的,因此str的地址是不同的。StringTable返回的引用會給new出來的空間。
1.3 intern方法
intern方法的作用為將當前的字符串常量值放入String Table,放入規則與前面的規則一致。
public class Test {public static void main(String[] args) {char[] ch=new char[]{'a','b','c'};String s1=new String(ch); //abc不會放入StringTable,因為不是雙引號,不會自動放//s1.intern();String s2="abc";System.out.println(s1==s2); //寫intern為true,不寫為false}
}