java 常量池是什么_java常量池是什么?要如何实现?

为了更好的优化系统性能,常量池就出现了,它的出现让频繁创建或销毁对象不在影响性能,下面我们就来了解下它。

常量是什么?

在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工具网了解详情。

推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值