为什么将字符串文字存储在Java的字符串常量池中?

有两种在Java中创建String对象的方法

  • 通过使用新运算符

String str = new String("nhooo.com");
  • 通过使用字符串文字

String str = "nhooo.com";

每当我们String()用Java调用new时,它将在堆内存中创建一个对象,并且String常量将进入String Constant Pool(SCP)。 

对于对象,JVM使用SCP来进行Java中的有效内存管理。与其他Java对象不同,它们引入了String常量池,而不是在堆区域上管理String对象。String常量池的重要特征之一是,如果池中已经存在String常量,则它不会创建相同的String对象。

示例

public class SCPDemo {
   public static void main (String args[]) {
      String s1 = "nhooo.com";
      String s2 = "nhooo.com";
      System.out.println("s1 and s2 are string literals:");
      System.out.println(s1 == s2);
      String s3 = new String("nhooo.com");
      String s4 = new String("nhooo.com");
      System.out.println("s3 and s4 with new operator:");
      System.out.println(s3 == s4);
   }
}

输出结果

s1 and s2 are string literals:
true
s3 and s4 with new operator:
false