Java 的 String与常量池

来源:互联网 发布:模拟摄像头改网络 编辑:程序博客网 时间:2024/06/14 08:57
String str = "Hello";
/**
* 与创建字符串常量不同的是,不管常量池中是否存在相同的字符串,都会在堆内存中创建新的字符串对象
*/
String b = new String("Icon");
/**
* java虚拟机JVM内部维护了一个字符串常量池,每当创建字符串常量时,JVM会到字符串常量池中检查,
* 如果常量池中存在,返回常量池中的字符串对象引用,不存在则创建一个新的字符串对象放入常量池中
* **/
String c = "Icon";
/**intern方法返回字符串对象在字符串常量池中的对象引用,若字符串常量池中尚未有此字符串,
则创建一个新的字符串对象放入常量池中 **/
String d = b.intern();
//比较堆中b字符串对象在常量池中的引用 和 c字符串值 ,intern方法返回常量池中相同的字符串应用对象
//所以 b.intern()返回的对象 和 c 引用的对象是同一个

System.out.println(b.intern() == c);

System.out.println(d == c);

/**
* 把常量pool 和 c字符串对比,两者引用的都是常量池中的字符串对象Icon,所以是相等的
*/
System.out.println(pool == c);

/**
* 实际声明一个字符串字面量s时,s是存在栈中保存了一个指向方法区中常量池里的一个地址。
* 当字符串进行拼接时,如果是单纯的已知字面量拼接,在编译期间,编译器会自动将拼接结果在常量池搜索并存入,
* 如果是字符串和变量、对象拼接时,由于变量和对象是不可预知部分,编译器不会进行优化,需等待运行时才能知道变量、对象地址,
* 所以jvm在运行时才将拼接结果开辟新的堆内存地址并存入结果值。
*/

原创粉丝点击