字符串常量池

发布时间 2023-11-25 18:15:27作者: guoyu1

字符串常量池是 Java 中的一块特殊的内存区域,用于存储字符串字面量。它具有以下几个特点:

  1. 不可修改性(Immutable): 字符串常量池中的字符串对象是不可修改的,一旦被创建,其内容就不能被修改。任何对字符串的修改都会创建一个新的字符串对象。

  2. 字符串重用: 字符串常量池是为了节约内存而设计的。相同内容的字符串在常量池中只会存在一份,这样可以通过引用相同的对象来减少内存占用。

  3. 编译期优化: 字符串常量池的内容是在编译期间确定的,即在代码编写时就已经确定了。这使得编译器能够对字符串进行一些优化,例如合并相同的字符串字面量。

在Java中,字符串常量池有两种存储方式:

  • String Pool(字符串池): 存储在堆中,是在Java 7及之前的版本中的默认存储方式。使用 String.intern() 方法可以将字符串对象从堆中移到字符串池中。

  • Metaspace(元空间): 存储在元空间中,是在Java 8及以后的版本中的默认存储方式。由于元空间的特性,字符串常量池的内存不再受到永久代的限制,可以根据需要动态调整大小。

下面是一个简单的例子,演示了字符串常量池的一些特性:

java
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true,因为它们引用的是字符串常量池中相同的对象 System.out.println(str1 == str3); // false,因为str3是通过new关键字创建的,不在常量池中 System.out.println(str1.equals(str3)); // true,内容相同,使用equals比较

在上述代码中,str1str2 引用了相同的字符串常量池中的对象,而 str3 则是通过 new 关键字创建的新对象。