Java 中 String new 和 不 new 的区别是什么?(超详细)

更新时间 2023-04-03 19:37:29

先看示例代码,同样是创建一个字符串对象,二者之间有什么却区别呢?

String str = "i";
String str = new String("i");

功能上来说,这两个语句的效果是一样的,都是创建一个值为 "i" 的字符串对象。

但是,它们的实现方式是不同的:

  1. String str = "i" 是一个字符串字面值(String Literal),Java 编译器会在编译时将它解析为一个字符串对象,并在编译后的字节码中将其存储在常量池中。当程序运行到这一行时,会从常量池中获取该字符串对象的引用,赋值给 str 变量。如果已经存在相同的字符串对象,则直接返回该对象的引用,而不会重新创建对象。
  2. String str = new String("i") 是通过调用 String 类的构造函数来创建一个新的字符串对象,其值为 "i"。在这种方式下,会在堆内存中创建一个新的字符串对象,并将其引用赋值给 str 变量。

需要注意的是,由于字符串字面值是存在常量池中的,因此使用字符串字面值可以提高程序的性能和内存使用效率。而使用 new String() 的方式则需要在堆内存中重新创建一个新的字符串对象,如果使用不当,可能会造成不必要的内存开销。