三、运行时的动态常量(学习笔记)
public class Test { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s1==s2); System.out.println(s1==s3); System.out.println(s1==s3.intern()); System.out.println(s3==s4); } }
代码执行的结果:
true
false
true
false
出现上面的
结果的解释如下图
任何一个字符串的创建都会扔到常量池中,常量池是方法区的一块存储空间
通过new 创建的对象会放到堆上
== 比较的对对象的内存地址
String 在常量池中存储的数据结构类似一个HashSet ,里面存储的是无序 不重复的字符串,所以两个“abc” 放入到里面存储的是一个
s3 和 s4 是通过new创建的对象,所以放入到堆中,所以两个对象的内存地址不一样。
而 通过 s3.intern() 这个方法,可以将s3从堆内存中放入到常量池中,所以进行比较的时候两个对象的地址是一样的。