Java 常量池的字符串比较

常量池的分类

Java的常量池分为静态常量池和运行常量池。
静态常量池是class文件中的常量池,主要存放两大类型常量:字面量和符号引用量。字面量是Java语言层面常量的概念,如文本字符串,声明为final的常量值。符号引用是编译原理方面的概念,如类和接口的全限定名、字段名称和描述符、方法名称和描述符。
运行常量池是jvm虚拟机在完成装载操作后,将class文件中的常量载入到内存中,并且保存到方法区中。我们常说的常量池是运行常量池,运行常量池的数据大部分来源于各个class文件的静态常量池。

常量池的好处

常量池是为了避免频繁的创建和销毁对象而影响系统性能,实现了对象的共享。

  1. 节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
  2. 节省运行时间

常量池的一些例子

字符串地址比较
由图得知,在编译成class文件时。变量a,b由于是字面量,被放到内存池中,只存在一个值“a”,所以变量a,b指向同一个地址,返回为true。c是在堆内存中创建一个新的地址,所以为false。intern()是将字符串保存到常量池中,所以值“a”被保存到常量池中,但是由于"a"已经存在了,所以变量c直接指向常量池中"a"的地址。

a+b
这里判断a+b;因为在编译时编译器无法判断a和b的值,所以对于编译器来说此时a+b的值是不确定的,所以返回为false;
final a+b
这里将变量a,b设置为常量并且初始化,所以对于这种情况编译器在编译时就对a和b拼接并且将拼接的结果放到常量池中。

未初始化
这个虽然最终结果是“aa”,但是编译器在编译时是a,b的值是未赋值,所以不会执行a+b的操作,所以a+b的地址是不确定的,返回false

本人对该方面了解不是很深入,如果发现有纰漏,请告知纠正,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值