淘客怎么做网站,百度优化只做移动网站没有pc站,一个网站如何推广,网站克隆 有后台登录#x1f4da; Java 运行时常量池笔记#xff08;详细版#xff09;
Java 的运行时常量池#xff08;Runtime Constant Pool#xff09;是 JVM 方法区的一部分#xff0c;用于存储编译期生成的字面量和符号引用。它是 Java 类文件常量池的运行时表示#xff0c;具有动态… 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); // trueintern() 方法确保 str3 指向常量池}
}输出结果
true
true️ Go 语言模拟运行时常量池
Go 语言没有直接的运行时常量池但可以通过 map 模拟类似的功能。
1. 实现思路
使用 map 存储字符串常量。提供 intern 方法将字符串放入“常量池”并返回引用。
2. 代码实现
package mainimport (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) // trueGo 会优化为同一个引用fmt.Println(str1 str3) // trueintern 方法返回常量池中的引用
}输出结果
true
trueJava 与 Go 的对比
特性Java 运行时常量池Go 模拟常量池存储位置JVM 方法区元空间/永久代自定义 map 数据结构动态性支持动态添加如 String.intern()通过 map 动态管理共享性同一个类的运行时常量池共享通过全局 map 实现共享语言特性JVM 提供原生支持需要手动实现 总结
Java 运行时常量池是 JVM 的重要组成部分提供了动态性和共享性适合在运行时管理常量。Go 语言虽然没有直接的运行时常量池但可以通过 map 等数据结构模拟类似的功能。两者的实现机制不同但核心思想一致通过共享常量减少内存开销提高性能。
通过本文的学习你可以深入理解 Java 运行时常量池的原理并掌握如何在 Go 中模拟类似的功能。希望这篇笔记对你有帮助