通过字符串常量创建

通过字符串常量创建 String 对象是最常见的创建方式,一般形式如下所示:

  1. String str = "hello world";

使用这种方式创建 String 对象时, JVM 会先在字符串常量池中检查是否存在该对象,如果存在,返回该对象的引用地址;如果不存在,则在字符串常量池中创建该字符串对象并且返回引用。

对上面的代码来说,仅在字符串常量池中创建了 1 个 String 对象,变量 str 是对该对象的引用。使用这种方式创建的好处是:避免了相同值的字符串重复创建,节约了内存。

构造函数创建

  1. String str = new String("hello world");

使用这种方式创建 String 对象的过程比较复杂,分为两个阶段

  • 在编译时,字符串 “hello world” 会被加入到常量结构中;
  • 在类加载时会在常量池中创建 “hello world” 字符串;
  • 在执行 new 方法时,JVM 将会调用 String 的构造函数,同时引用常量池中的 “hello world” 字符串,并在堆内存中创建一个 String 对象,然后返回堆中的引用地址给变量 str

即上述代码创建了 2 个对象:一个在字符串常量池中,另一个在堆中。