字符串常量池存的是实例还是引用?(Java中的几种常量池)

本文目录
Java中的几种常量池
字符串常量池:当类加载完成,在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中。
class文件常量池:用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。
运行时常量池:当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中。
JVM 常量池中存储的是对象还是引用
之前答案不够准确,以下为修改答案:
在1.6的时候,HotSpot JVM方法区中的字符串常量池存放的是字符串对象,1.7的时候字面量(interned strings)转移到了java heap中。
1.8的时候方法区取消,改为元数据空间metaspace,存储的位置在java堆中。
Java中的字符串常量池与Java中的堆和栈的区别
java常量池不在堆中也不在栈中,是独立的内存空间管理。
1. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
2. 堆:存放所有new出来的对象。
3. 常量池:存放字符串常量和基本类型常量(public static final)。
对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。
java 常量池
a不是引用,一般引用存的是内中的一个地址,int a=0是在栈中开的空间,常量是指变量前有final关键字的情况。
JAVA中关于字符串的一个问题
在JDK5.0里面,Java虚拟机在启动的时候会实例化9个对象池,这9个对象池分别用来存储8种基本类型的包装类对象和String对象。当我们在程序中直接用双引号括起来一个字符串时,JVM就到String的对象池里面去找看是否有一个值相同的对象,如果有,就拿现成的对象,如果没有就在对象池里面创建一个对象,并返回。在任何情况下,只要你去new一个String对象那都是创建了新的对象
所以在本题中,栈中的s1和s2指向的字符串都是在池中找到的同一个字符串“123”,所以用"=="来比较s1和s2两个引用指向的地址当然是一样的
而一旦你new String 那么肯定就是在堆中生成了一个新的对象,这时
s3指向的是堆中的地址,s1指向池的地址,你比较S1==s3当然是false了
选者C

更多文章:
线程池内中断某个线程(如何终止 android线程池中的任务)
2026年1月7日 07:15
为什么mysql没有bin目录(我在windows7下面安装mysql怎么会没有bin目录呢)
2026年2月7日 02:30
进程管理器端口(win7系统怎么查看端口被哪个进程占用情况呢)
2026年4月9日 11:45
translate的用法及其词组(英语Arrival Site怎么翻译)
2026年7月16日 00:00
grassland(grassland怎么读 英语grassland怎么读)
2025年12月10日 09:45
elementui和bootstrap 哪个好(学习bootstrap还是vue好)
2026年4月1日 10:45
下载jquery最新版本教程(怎么引用bootstrap轮播图)
2026年8月26日 01:45
二次分式怎么求值域(如果是二次分式函数,那么应该怎么求值域)
2026年9月18日 04:30
手机上怎么显示html图片(html格式的图片在手机上怎么能打开)
2026年8月9日 01:30
js的replaceall(js 怎么替换不了 | 这个符号)
2026年9月16日 13:00
安卓activity软件(activity(Android组件中最重要的四大组件之一)详细资料大全)
2026年7月30日 07:00














