黑马程序员技术交流社区
标题:
关于常量池的疑问??
[打印本页]
作者:
孙国军
时间:
2012-4-23 02:18
标题:
关于常量池的疑问??
String s="hello";
s=s+"word";
我知道引用数据类型s声明比赋值后,会在堆内存中开辟一个空间,用于存放字符串"hello",然后把它的地址值赋给栈内存中的s,最后会
把字符串"hello"存入常量池中;
执行第二行代码的时候,会收先从常量池中取出"hello"然后在查看常量池中是否有"word",如果有直接取出,如果没有,在堆内存中从新
创建,并把两个字符串连接后得到的新字符串赋给s;
我的疑问就是,在程序全部执行完毕后,常量池中的数据是否还会存在??
作者:
刘永菲
时间:
2012-4-23 10:55
在程序全部执行完毕后,常量池中的数据仍然存在。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名; 字段的名称和描述符; 方法和名称和描述符。虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。
在程序执行的时候,常量池会储存在Method Area,而不是堆中.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2