首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

内存和常量池的关系,请高手帮忙解惑,该怎么解决

2012-02-21 
内存和常量池的关系,请高手帮忙解惑以前一直就理解的是栈内存存放基本数据类型,还有引用数据类型的引用值,

内存和常量池的关系,请高手帮忙解惑
以前一直就理解的是栈内存存放基本数据类型,还有引用数据类型的引用值,而堆内存存放对象。最近了解了一些常量池的知识,反而更加迷惑了,希望有前辈指点下。

Java code
public class TestClass{    public void testMethod(){        String a="hello";//句1        String b=new String("world");//句2    }}



JVM加载class的时候,会给每个class维护一个常量池表,上面的常量a,会在TestClass类的存储区域中的常量池表里被记录,指向String类的常量池CONSTANT_String_info表的"hello"字符串值,是不是说句1中实际上只创建了一个String,也就是CONSTANT_String_info表里的"hello"?
如果CONSTANT_String_info表里已经有过这个"hello"值,这时候是不是说根本没有创建新的String,只不过是在TestClass的常量池表里加了个a的标识值指向已经存在的"hello"?

而句2中,b在栈内存中分配一个引用,指向堆内存里的一个String对象,这个String对象依然要从String类的常量池CONSTANT_String_info表里面复制过来,也就是创建了一个String(在堆内存中)。
但是如果String类的常量池CONSTANT_String_info表没有该值"world",必须先在其中添加"world",再复制一个到堆内存中,也就是创建了两个String对象。不知道是不是这样理解的?




[解决办法]
对 是这样的

热点排行