Constant Pool

Java

String s1 = "Hello";
String s2 = s1;
String s3 = "Hello";
String s4 = new String("Hello");
String s5 = s4;
String s6 = new String("Hello");

System.out.println(s1 == s2);       // true
System.out.println(s1 == s3);       // true
System.out.println(s2 == s3);       // true
		
System.out.println(s4 == s5);       // true
System.out.println(s4 == s6);       // false
System.out.println(s5 == s6);       // false


C/C++

char * s1 = "abcd";
char * s2 = "abcd";
char s3[] = "abcd";
char s4[] = "abcd"; 

printf("%d\n", s1 == s2);       // true
printf("%d\n", s3 == s4);       // false


### Java运行时常量池的概念及工作原理 #### 什么是运行时常量池? 运行时常量池是类加载过程中创建的一种数据结构,它是方法区的一部分[^1]。它存储了编译期间产生的各种字面量和符号引用,并在运行期解析为直接引用。 #### 运行时常量池的内容 运行时常量池包含了多种类型的常量,例如整数、浮点数、字符串字面量以及对类和接口的符号引用等[^2]。这些常量是在程序编译阶段被确定并存放在 `.class` 文件中的常量池表中,在类加载到内存时会被复制到运行时常量池中。 #### 工作原理 当 JVM 加载一个类文件时,会将该类对应的常量池表中的内容初始化到运行时常量池中[^3]。对于不可变对象(如 `String`),JVM 可能会在特定实现中将其缓存在内存池中以提高性能。这种机制的一个典型例子就是字符串驻留(String Interning)。如果某个字符串已经存在于运行时常量池中,则不会再次创建新的实例;而是返回已存在的引用。 以下是通过代码展示如何利用运行时常量池的工作方式: ```java public class RuntimeConstantPoolExample { public static void main(String[] args) { String str1 = new StringBuilder("Java").append("Runtime").toString(); System.out.println(str1.intern() == str1); // true String str2 = new StringBuilder("Ja").append("vaRuntime").toString(); System.out.println(str2.intern() == str2); // false } } ``` 上述代码片段展示了两个不同的情况:第一个比较操作的结果为 `true` 是因为 `"JavaRuntime"` 字符串已经被加入到了运行时常量池中,而第二个则可能由于不同版本或者具体实现细节导致结果不一致[^4]。 #### 总结 运行时常量池作为方法区内的重要组成部分,负责保存所有的常量值及其相关信息。它的设计极大地优化了资源利用率与访问效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值