1.运行时常量池属于线程共享区中的方法区。java
2.运行时常量池用于编译期生成的各类自变量,符号引用,这部份内用将在类加载后接入方法区的运行时常量池中存放。数据结构
看以下代码所示,如图:线程
public class Test { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System.out.println(s1 == s2); System.out.println(s1 == s3); } }
很明显s1 == s2为true,而s1 == s3为false。对象
由于基本数据类型和抽象数据类的引用是放在栈帧的局部变量表中。因此s1 s2是放在栈帧的局部变量表中。而“abc”这个对象则是放在运行时常量池中。get
而这个常量池有钟数据结构叫Stringtable,它的数据类型能够理解为HashSet。而HashSet是无序的,不可重复的。所以第一次将定义的“abc"放入其中编译
而第二次定义中发现常量池中有“abc”了,则再也不建立“abc"了,此时s1 和s2则引用的是同一个”abc“。所以s1 == s2为true。table
而s3则是经过new出来的实例,则放进java堆中,此时s3引用的是堆中的”abc"。所以s1 == s3为false。class
若是将s3变更一下又会产生什么结果呢?以下代码所示:>>>>阅读全文变量