java关于常量池的问题

在代码里直接写的String s ="abc"会把abc放在class文件的常量池。String#intern会把String放在运行时的常量池。new String实际上是ldc "cpool"new Ljava/lang/Stringinvokespecial \u0026lt;init\u0026gt;上面可能不太准确…手机打字好累
■网友
你老师说的没错。字符串本身是一个对象啊,对象在堆中,没毛病。所以常量池是个什么东西?并不是说常量池就像一个池子一样,常量都装在里面,实际上常量池里面放的只是一些引用,这些引用指向了堆中的具体的对象。另外题主对于常量池有点一概而论的感觉。在class文件中存在一个常量池,里面主要放的字面量和符号引用,很明显,你的"123"作为字符串字面量就在这里面;方法区中有一个常量池叫做运行时常量池,方法区外有个常量池叫做字符串常量池(与方法区平级),后者是全局共享的。加载class文件时,class文件中的常量池中的大部分东东会进入运行时常量池,但String是“进入”字符串常量池。这个进入为什么要加引号呢,最上面已经说了,字符串本身是在堆中(和其他一般对象一个鸟样,刚出来的时候很大可能是在eden中),然后在字符串常量池中有指向它的引用。大概长这样: 【java关于常量池的问题】 java关于常量池的问题


■网友
同好奇一下,什么学校啊?赞同那条详细的回答,反对+没有帮助那条2B回答。
■网友
正在学习jvm,第一个问题“123”作为字符串常量在编译期就被放到了常量池,关于常量池可以参考:常量池 · JVM学习笔记(正在学习中,欢迎start,一起学习)。至于为什么把常量池,确切的说是运行时常量池放到方法区,你就当作jvm就是这么设计的就行了吧。


    推荐阅读