为了更好的优化系统性能,常量池就出现了,它的出现让频繁创建或销毁对象不在影响性能,下面我们就来了解下它。
常量是什么?
在java中,用final关键词修饰的成员变量就是常量,它的值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
什么是java常量池
常量池,是指在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包含了关于类、接口、方法中的常量,也包括了字符串常量和符号引用。
常量池,主要用于存放两大类常量:字面量(Literal)与符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,像是文本字符串,声明为final的常量值等,符号引用就属于编译原理方面的概念,它包含了这三种类型的常量:类和接口的全限定名;字段名称和描述符; 方法名称和描述符
Java中的常量池实际上分为两种形态的,分别是静态常量池和运行时常量池。
所谓静态常量池,即*.class文件中的常量池,在class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
运行时常量池则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们一般说的常量池,就是指这种方法区中运行时常量池。
常量池的优点
常量池实现了对象的共享,它是为了避免频繁的创建和销毁对象而影响系统性能而创建的。
String s1=new String("abc"); 我们以上面代码为例子,你要理解constant pool, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。 如果你用了String s1 = new String("abc"); 那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的"abc"被作为常量读入,在constant pool里创建了一个共享的"abc" 然后,当调用到new String("abc")的时候,会在heap里创建这个new String("abc"); 考虑类加载阶段和实际执行时。 (1)类加载对一个类只会进行一次。"abc"在类加载时就已经创建并驻留了(如果该类被加载之前已经有"abc"字符串被驻留过则不需要重复创建用于驻留的"xyz"实例)。驻留的字符串是放在全局共享的字符串常量池中的。 (2)在这段代码后续被运行的时候,"abc"字面量对应的String实例已经固定了,不会再被重复创建。所以这段代码将常量池中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s1 持有。
以上就是本篇文章的所有内容,更多编程常见问题敬请关注奇Q工具网了解详情。
推荐阅读: