日期:2014-05-20  浏览次数:20542 次

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

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对象。不知道是不是这样理解的?




------解决方案--------------------
对 是这样的