JVM笔记3-java内存区域之运行时常量池

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变更一下又会产生什么结果呢?以下代码所示:>>>>阅读全文变量

相关文章
相关标签/搜索