每天记录学习的新知识 :常量池
发布日期:2021-05-10 05:21:12 浏览次数:22 分类:精选文章

本文共 1179 字,大约阅读时间需要 3 分钟。

简介常量值和常量


什么是常量值?

常量值,又称为字面常量,是指通过数据直接表示的简单且固定值。常量值可以是整型数、实型数、布尔值、字符或字符串等。它们的值在运行时是固定的,且无法被修改。


常量与常量值的区别

常量与常量值的区别在于前者可以通过符号表示,需要在程序中定义并初始化后才能使用。例如,在Java中,常量可以用final修饰,常量值无法改变。一旦定义,它们的值在程序运行期间保持不变。


Java中的常量池

Java中的常量池(Constant Pool)用于存储两种主要类型的常量:字面量和符号引用量。


字面量

字面量是通过编译期直接生成的值,通常有两种形式:

  • 数值字面量:如1233.14false
  • 字符串字面量:如"Hello""Hello World"
  • 字面量只能作为右值出现,例如右边的表达式int a = 123;中,123是字面基数。


    符号引用量

    符号引用量涉及编译时的常量,主要包括:

  • 类和接口的全限定名:例如com.example.Hello
  • 字段名称和描述符:例如字段public static final String MSG
  • 方法名称和描述符:例如方法public static void main(String[] args)
  • 符号引用量通常在类文件中存储。


    运行时常量池

    在JVM中,运行时常量池的特点是动态性。它不只是从类文件中获取常量池内容,还可以在运行时添加新的常量。

    内存区域

    • Perm Gen区(JDK6):用于存储类常量池。
    • 堆区(JDK7和JDK8):用于存储运行时常量池。

    动态性

    运行时常量池支持动态添加常量。例如,String intern() 方法会将字符串放入字符串常量池中。


    字符串常量池

    字符串常量池是一个HashSet,主要用于存储字符串实例和字符串引用。它是在运行时动态维护的,惰性加载的。

    使用场景

    • 使用双引号直接赋值的字符串。
    • 使用intern()方法生成的字符串引用。
    • 其他情况(如"lift" + "ing")生成的字符串。

    适用对象

    • s1 = "Hello"s2 = "Hello" 适用于字符串常量池。
    • s3 = "Hel" + "lo" 也适用,但不会存储完整的字符串。
    • s6 = s5.intern() 适用于字符串引用。

    内存区域

    • JDK6:存储字符串常量。
    • JDK7和JDK8:存储字符串常量和字符串引用。

    其他基本类型的常量池

    除了字符串,其他基本类型(如整型、浮点型、布尔值)的常量值在JVM中的处理方式类似于常量池,但直接存储在运行时数据区中。


    总结

    常量池是JVM中的一个重要概念,用于存储编译期和运行期的常量值。常量值和常量的理解对于优化性能和理解高级Java特性(如内存管理)至关重要。通过合理利用常量池,可以提升应用程序的性能和稳定性。

    上一篇:每天记录学习的新知识 :String和String.intern()实现原理
    下一篇:每天记录学习的新知识 :String的类型转换和拼接

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年04月10日 08时24分28秒