常量池随笔
常量池保存了类, 接口, 方法等的常量数据, 也保存了String常量.
如下代码中a1, a2不是String常量(在编译期即被确定), a3则是, a1.intern()也可以获得String常量(是在运行时被装载的常量).
String a1 = new String("a"), a2 = new String("a"), String a3 = "a"; System.out.println(a1 == a2); //false
System.out.println(a1.intern() == a3); //true
String b1 = "bb", b2 = "bb", b3 = "b"+"b"; System.out.println(b1 == b2); //true
System.out.println(b1 == b3); //true
返回结果 (a1 == a2) = false, (a1.intern() == a3) = true
为什么呢? 原来a1, a2是不同的对象并且被存放在堆中, a1.intern()则返回相应值的String常量.
(b1 == b2) = true, (b1 == b3) = true.
而b1, b2则保存在常量池中, b3是由两个String常量连接而成 其结果就是常量"bb".