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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© haozi050 中级黑马   /  2014-1-18 15:43  /  1847 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么是常量池?有什么作用?请回答的详细点,谢谢!

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

4 个回复

倒序浏览
常量池
Java是一种动态链接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值外,还包含一些以文本形式出现的符号引用,比如:
类和接口的全限定名;
字段的名称和描述符;
方法的名称和描述符。
在java用于保存在编译期已确定的,已编译的class文件中的一份数据。执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
常量池是一个内存空间,存在于方法区中。
在Java程序中,有很多的东西是永恒的,不会在运行过程中变化。
比如一个类的名字,
一个类字段的名字/所属类型,
一个类方法的名字/返回类型/参数名与所属类型,
一个常量,还有在程序中出现的大量的字面值。
还比如String类,它是一个final类,每一个字符对象都是不可更改的,
所以全部都是存储在常量池中。
在JVM加载class后,在方法区中为它们开辟了空间,进行存储。

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间。本文只从java使用者的角度来探讨java常量池技术,并不涉及常量池的原理及实现方法。个人认为,如果是真的专注java,就必须对这些细节方面有一定的了解。但知道它的原理和具体的实现方法则不是必须的。

1,常量池中对象和堆中的对象

public class Test{

Integer i1=new Integer(1);
   Integer i2=new Integer(1);
//i1,i2分别位于堆中不同的内存空间

   System.out.println(i1==i2);//输出false


   Integer i3=1;
   Integer i4=1;
//i3,i4指向常量池中同一个内存空间

   System.out.println(i3==i4);//输出true

//很显然,i1,i3位于不同的内存空间

System.out.println(i1==i3);//输出false

}

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
1. 常量池和栈内存还有堆内存是不同的内存空间。
2. 常量池中存放的多数都是常量,字符串也是存放在这里,是因为现实生活中重复的字符串有很多重复的内容,如果将重复的每一个内容都开辟一个空间的话,这样就浪费了很多的内存空间。
3. 以字符串为例说明,例如
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
会发现结果是true,也就是说他们使用的是同一个常量池中的变量。
4. 以下的链接有详细的说明
http://blog.163.com/ichuanbo@126/blog/static/166706146201341801357935/

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

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