主页 > 其他  > 

Java运行时常量池笔记(详细版

Java运行时常量池笔记(详细版
📚 Java 运行时常量池笔记(详细版)

Java 的运行时常量池(Runtime Constant Pool)是 JVM 方法区的一部分,用于存储编译期生成的字面量和符号引用。它是 Java 类文件常量池的运行时表示,具有动态性和共享性。


🧠 运行时常量池的核心概念 1. 什么是运行时常量池? 运行时常量池是 JVM 方法区的一部分,存储类文件中常量池的内容。它包含: 字面量:如字符串、整数、浮点数等。符号引用:如类名、方法名、字段名等。 在类加载时,常量池的内容会被加载到运行时常量池中。 2. 运行时常量池的特点 动态性:运行时常量池的内容可以在运行时动态添加。例如,String.intern() 方法可以将字符串添加到常量池中。共享性:同一个类的运行时常量池可以被多个实例共享。内存分配:运行时常量池是方法区的一部分,方法区在 JDK 8 之前是永久代(PermGen),在 JDK 8 之后是元空间(Metaspace)。
🛠️ 运行时常量池的工作原理 1. 类加载时的常量池加载

当 JVM 加载一个类时,会将类文件中的常量池内容加载到运行时常量池中。

2. 符号引用的解析

符号引用(如类名、方法名)在类加载时会被解析为直接引用(如内存地址)。

3. 动态添加内容

通过 String.intern() 方法,可以将字符串动态添加到运行时常量池中。


📊 运行时常量池的存储结构 #mermaid-svg-gq6dUJUFABlnmW83 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gq6dUJUFABlnmW83 .error-icon{fill:#552222;}#mermaid-svg-gq6dUJUFABlnmW83 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gq6dUJUFABlnmW83 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-gq6dUJUFABlnmW83 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gq6dUJUFABlnmW83 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gq6dUJUFABlnmW83 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gq6dUJUFABlnmW83 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gq6dUJUFABlnmW83 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gq6dUJUFABlnmW83 .marker.cross{stroke:#333333;}#mermaid-svg-gq6dUJUFABlnmW83 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gq6dUJUFABlnmW83 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gq6dUJUFABlnmW83 .cluster-label text{fill:#333;}#mermaid-svg-gq6dUJUFABlnmW83 .cluster-label span{color:#333;}#mermaid-svg-gq6dUJUFABlnmW83 .label text,#mermaid-svg-gq6dUJUFABlnmW83 span{fill:#333;color:#333;}#mermaid-svg-gq6dUJUFABlnmW83 .node rect,#mermaid-svg-gq6dUJUFABlnmW83 .node circle,#mermaid-svg-gq6dUJUFABlnmW83 .node ellipse,#mermaid-svg-gq6dUJUFABlnmW83 .node polygon,#mermaid-svg-gq6dUJUFABlnmW83 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gq6dUJUFABlnmW83 .node .label{text-align:center;}#mermaid-svg-gq6dUJUFABlnmW83 .node.clickable{cursor:pointer;}#mermaid-svg-gq6dUJUFABlnmW83 .arrowheadPath{fill:#333333;}#mermaid-svg-gq6dUJUFABlnmW83 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gq6dUJUFABlnmW83 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gq6dUJUFABlnmW83 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-gq6dUJUFABlnmW83 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-gq6dUJUFABlnmW83 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gq6dUJUFABlnmW83 .cluster text{fill:#333;}#mermaid-svg-gq6dUJUFABlnmW83 .cluster span{color:#333;}#mermaid-svg-gq6dUJUFABlnmW83 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gq6dUJUFABlnmW83 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 运行时常量池 字面量 符号引用 字符串 整数 浮点数 类名 方法名 字段名
🧪 Java 示例代码 public class ConstantPoolExample { public static void main(String[] args) { String str1 = "hello"; // 字面量,直接放入常量池 String str2 = "hello"; // 从常量池中获取 String str3 = new String("hello").intern(); // 显式放入常量池 System.out.println(str1 == str2); // true,指向常量池中的同一个对象 System.out.println(str1 == str3); // true,intern() 方法确保 str3 指向常量池 } }

输出结果:

true true
🛠️ Go 语言模拟运行时常量池

Go 语言没有直接的运行时常量池,但可以通过 map 模拟类似的功能。

1. 实现思路 使用 map 存储字符串常量。提供 intern 方法,将字符串放入“常量池”并返回引用。 2. 代码实现 package main import ( "fmt" ) // 模拟常量池 var constantPool = make(map[string]string) // 模拟 intern 方法 func intern(s string) string { if val, ok := constantPool[s]; ok { return val // 如果已存在,返回常量池中的引用 } constantPool[s] = s // 否则,放入常量池 return s } func main() { str1 := "hello" // 字符串字面量 str2 := "hello" // 字符串字面量 str3 := intern("hello") // 显式放入常量池 fmt.Println(str1 == str2) // true,Go 会优化为同一个引用 fmt.Println(str1 == str3) // true,intern 方法返回常量池中的引用 }

输出结果:

true true
🔄 Java 与 Go 的对比 特性Java 运行时常量池Go 模拟常量池存储位置JVM 方法区(元空间/永久代)自定义 map 数据结构动态性支持动态添加(如 String.intern())通过 map 动态管理共享性同一个类的运行时常量池共享通过全局 map 实现共享语言特性JVM 提供原生支持需要手动实现
🎯 总结 Java 运行时常量池是 JVM 的重要组成部分,提供了动态性和共享性,适合在运行时管理常量。Go 语言虽然没有直接的运行时常量池,但可以通过 map 等数据结构模拟类似的功能。两者的实现机制不同,但核心思想一致:通过共享常量减少内存开销,提高性能。

通过本文的学习,你可以深入理解 Java 运行时常量池的原理,并掌握如何在 Go 中模拟类似的功能。希望这篇笔记对你有帮助!🚀

标签:

Java运行时常量池笔记(详细版由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“Java运行时常量池笔记(详细版