java运行时常量池简单介绍

java有两种常量池:

1静态常量池。

静态常量池即*.class文件中的常量池,不仅仅包含字符串(数字)字面量,还包含字段,类、方法的信息(符号引用),占用class文件绝大部分空间,类加载过程中会把class文件中静态常量池的内容转移到运行时常量池,把符号引用转为直接引用。

2运行时常量池

java一共实现了6中基本类型的常量池:Byte , Short,Integer,Long,Boolean,Characher。(Double和Float没有实现)
1种String的常量池。

运行时常量池在哪:

Java6,运行时常量池是存放在方法区中的。
Java7及以后,将运行时常量池是存放到了堆中。

基本类型常量池:

和String常量池不同,基本类型的常量池只能储存 -128到127之间的常量(这也正是为什么Double和Float这种浮点数没有常量池的原因)
当你Integer a = 127;Integer b = 127;a和b会自动拆箱,会指向常量池中创建好的127常量,所以他们a==b为true;
但是当你Integer a = 128;Integer b = 128;超过了-128到127这个范围,它们就不会自动拆箱了,会在堆内存里面直接new对象,
这时候他们就和普通的类对象没有区别,用等号比较的只是他们指向的内存地址而已

String常量池:

String常量池可以储存各种不同大小的String常量,String str1 = “abc”时,他会在常量池创建abc这个字符串常量对象,并指向它
但你再次String str2 = “abc”时,先会去检查常量池是否有abc这个常量,由于常量池里已经有abc了,str2也直接指向同一个abc常量
正因为他们指向的内存相等,str==str1为true,而不是因为他们的内容相等所致

深入理解字符串常量池和intern方法强烈建议我写的另一篇文章:https://blog.csdn.net/qq_42862882/article/details/89179394

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值