黑马程序员技术交流社区
标题:
什么是常量池?
[打印本页]
作者:
haozi050
时间:
2014-1-18 15:43
标题:
什么是常量池?
什么是常量池?有什么作用?请回答的详细点,谢谢!
作者:
wodenhaowzg
时间:
2014-1-18 15:49
常量池
Java是一种动态链接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int、long等等)和对象型(如String及数组)的常量值外,还包含一些以文本形式出现的符号引用,比如:
类和接口的全限定名;
字段的名称和描述符;
方法的名称和描述符。
在java用于保存在编译期已确定的,已编译的class文件中的一份数据。执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
作者:
DOOR
时间:
2014-1-18 17:16
常量池是一个内存空间,存在于方法区中。
在Java程序中,有很多的东西是永恒的,不会在运行过程中变化。
比如一个类的名字,
一个类字段的名字/所属类型,
一个类方法的名字/返回类型/参数名与所属类型,
一个常量,还有在程序中出现的大量的字面值。
还比如String类,它是一个final类,每一个字符对象都是不可更改的,
所以全部都是存储在常量池中。
在JVM加载class后,在方法区中为它们开辟了空间,进行存储。
作者:
姬运涛
时间:
2014-1-18 18:17
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
}
作者:
三十而立
时间:
2014-1-20 09:07
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/
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2