-
字符串字面量:
- 当使用字符串字面量(如
String s = "hello";
)时,JVM会首先检查字符串常量池中是否已经存在该字符串。 - 如果存在,则不会创建新对象,而是返回常量池中该字符串的引用。
- 如果不存在,则会在常量池中创建一个新的字符串对象,并返回其引用。
- 当使用字符串字面量(如
-
使用
new
关键字:- 使用
new String("hello")
时,无论常量池中是否存在"hello"
,都会在堆内存中创建一个新的String
对象。 - 这个新对象的内容与常量池中的
"hello"
相同,但它是一个全新的对象,有自己的内存地址。 - 常量池中的字符串不受影响。
- 使用
-
字符串拼接:
- 使用
+
操作符拼接字符串时,如果参与拼接的字符串都是常量且没有变量参与,编译器可能会进行优化,将结果作为单个字符串字面量放入常量池(这取决于编译器的实现和JVM的优化)。 - 如果拼接过程中涉及到了变量,那么结果通常是通过
StringBuilder
(或StringBuffer
&#
- 使用