字符串常量池
大约 2 分钟java
概述
在Java中,字符串常量池是一个存储字符串字面量的特殊区域。它是为了提高内存利用率和减少字符串对象的重复创建而设计的。在Java中,字符串是不可变的,即一旦创建了一个字符串对象,就不能更改其内容。这特性使得字符串常量池更为有效。在JDK7中字符串存储在永久代,JDK8中迁移到元空间中。
深入理解
案例1:
String a = "test";
String b= "test";
System.out.println(a==b);
在这个例子中,a
和 b
都是字符串字面量,它们的值都是 "test"。字符串字面量在编译时会被放入字符串常量池,并且相同值的字符串字面量会被重用,因为字符串是不可变的。所以输出将是 true
。这是因为 a
和 b
都引用字符串常量池中的相同对象,它们的引用地址相同。在Java中,使用 ==
比较引用时,它会比较两个引用是否指向相同的对象。由于字符串常量池的重用机制,相同的字符串字面量将被重用,因此 a
和 b
引用的是相同的字符串对象。
案例2:
String str1 = new StringBuilder("58").append("tongcheng").toString();
System.out.println(str1);
System.out.println(str1.intern());
System.out.println(str1 == str1.intern());
System.out.println();
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2);
System.out.println(str2.intern());
System.out.println(str2 == str2.intern());
相关信息
intern方法: 调用intern方法时,如果池中已经包含一个字符串,则返回池中的字符串。否则将字符串将添加到池中,并返回对此对象的引用。
上述案例的结果如下所示:
这里着重讲一下为什么java这里不相等,java这个字符串是JDK内置,当加载sun.misc.Version
这个类的时候进入常量池。