A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙国军 中级黑马   /  2012-4-23 02:18  /  2042 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s="hello";
s=s+"word";

我知道引用数据类型s声明比赋值后,会在堆内存中开辟一个空间,用于存放字符串"hello",然后把它的地址值赋给栈内存中的s,最后会

把字符串"hello"存入常量池中;

执行第二行代码的时候,会收先从常量池中取出"hello"然后在查看常量池中是否有"word",如果有直接取出,如果没有,在堆内存中从新

创建,并把两个字符串连接后得到的新字符串赋给s;


我的疑问就是,在程序全部执行完毕后,常量池中的数据是否还会存在??

1 个回复

倒序浏览
在程序全部执行完毕后,常量池中的数据仍然存在。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名; 字段的名称和描述符; 方法和名称和描述符。虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(string,integer和floating point常量)和对其他类型,字段和方法的符号引用。对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的,对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。

在程序执行的时候,常量池会储存在Method Area,而不是堆中.

评分

参与人数 2技术分 +1 黑马币 +6 收起 理由
职业规划-刘倩老师 + 1
孙国军 + 6

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马