运行时常量池是属于方法区的一块,class文件中除了有类的版本、字段、方法、接口等描述信息以外,还有一项信息就是常量池,那么,这个常量池是干什么的呢?它就是用来存放编译期生成的各种字面量以及符号引用,这部分内容将在类加载后,进入方法区的运行时常量池中存放。举个例子
基本数据类型和抽象数据类型的引用会放到哪里呢?我们之前所讲的内存区域,随着这个方法的运行,会对每一个方法创建一个栈帧,栈帧里面有一个局部变量表,那么,我们所有的基本数据类型,包括抽象数据类型的引用,都会放到局部变量表中。String是一个抽象数据类型,那么s1就是存放的引用,s1和s2这两个引用分别存到一个局部变量表中,那么,“abc”到底放到哪里了呢?“abc”是一个对象,是一个引用类型,那么也就是说,“abc”应该按照我们的理解分配到Java堆中,如果是分配到Java堆中的话,其实我们说在创建对象实例的时候才会往堆中去分配空间,“abc”就是s1对象的实例,我们认为,如果说它每一次都创建了实例的话,每一次创建实例,每一次都会往堆中去新开辟一块空间来存放这个对象实例的数据
如果说,按照我们刚才说的,每一次创建一个实例,都需要在堆中开辟一块空间,那么,“==”比较的是地址,比如这是我们的堆内存
还有一块栈内存