String
在判断String存在什么地方时,需要先明确常量池与堆的概念(第2章中有说明)
常量池简单说明
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量
String存储位置
- 编译时能确定的变量直接存在常量池中
- 运行时才能确定的(运算符中包含变量),却是在堆空间创建对象
intern()方法
存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充
String的intern()方法就是扩充常量池的一个方法,当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量:
- 如果有,则返回其的引用
- 如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用
s3 = new String("123");//在堆空间中创建对象
s4 = s3.intern();//s4指向的对象在常量池中