JAVA中常量池、运行时常量池和串池的区别

一 常量池的作用

每一个class文件都有一个常量池,常量池保存着class的常量信息:字面量和符号引用。通俗来说,常量池就是class文件中的资源仓库,保存了文件运行时需要的常量信息,这些常量都是开发者定义出来的。
我们知道,每一个class文件都是javac编译来的,在编译过程中,java并没有保存方法、字段的内存布局,在运行时必须加载解析这些常量信息才能够将其翻译到具体的内存地址加以使用。

1.1 字面量

通俗的讲,字面量就是由字母、数字构成的字符串或数值。且字面量只可以右值出现,例如 a = 123, 123就是字面量。在这里要注意,编译后运行前,字符串也是字面量,也会存在常量池中,只不过这里的常量池就像个静态池。

1.2 符号引用

符号引用是编译原理中的概念,是相对于直接引用来的,主要包括以下三类常量:类的全限定名,字段的名称和描述符以及方法的名称和描述符。简单来说,就是存储了类和方法的入口信息。方便运行时加载入实际内存中。
类的全限定名:就是类名全称,带包路径的,用点隔开,例如java.lang.String
字段的名称和描述符:这里的难点在于字段是什么?字段和属性不同,其实就是类变量(static修饰的变量)
方法的名称和描述符:这个很好理解,就是方法名,修饰符,参数

二 运行时常量池

与常量池一样,每一个class在加载时都会有一个对应的运行时常量池,将方法区/元空间的常量池中的class文件加载进来时,常量池中的信息也会放到运行时常量池中,要注意的一点是,常量池中的字符串数据会被放到串池中(字符串常量池)

三 字符串常量池

就是在运行时保存字符串的池子,被放在堆中,而且全局唯一,这是和常量池与运行时常量池不一样的地方。之所以这么设计,是因为字符串不可更改,线程安全,因此可以共用,减少开销。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油光发亮的小猛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值