通过字符串常量创建
通过字符串常量创建 String 对象是最常见的创建方式,一般形式如下所示:
String str = "hello world";
使用这种方式创建 String 对象时, JVM 会先在字符串常量池中检查是否存在该对象,如果存在,返回该对象的引用地址;如果不存在,则在字符串常量池中创建该字符串对象并且返回引用。
对上面的代码来说,仅在字符串常量池中创建了 1 个 String 对象,变量 str
是对该对象的引用。使用这种方式创建的好处是:避免了相同值的字符串重复创建,节约了内存。
构造函数创建
String str = new String("hello world");
使用这种方式创建 String 对象的过程比较复杂,分为两个阶段:
- 在编译时,字符串 “hello world” 会被加入到常量结构中;
- 在类加载时会在常量池中创建 “hello world” 字符串;
- 在执行 new 方法时,JVM 将会调用 String 的构造函数,同时引用常量池中的 “hello world” 字符串,并在堆内存中创建一个 String 对象,然后返回堆中的引用地址给变量
str
。
即上述代码创建了 2 个对象:一个在字符串常量池中,另一个在堆中。