文章目录
- 一.字符串常量池(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}
}