面试题答案
一键面试- 直接赋值方式(
String str1 = "hello";
)- 创建机制:当使用直接赋值方式创建字符串时,Java首先会在字符串常量池中查找是否存在内容为“hello”的字符串对象。如果存在,就直接返回常量池中该字符串对象的引用,不会创建新的对象。如果不存在,则在常量池中创建一个新的字符串对象“hello”,并返回其引用。
- 存储机制:字符串对象存储在字符串常量池中。字符串常量池是JVM为了提高字符串的使用效率和节省内存而专门开辟的一块区域,其中的字符串对象是共享的。例如,如果有多个地方使用
String s1 = "hello";
String s2 = "hello";
,s1和s2指向的是常量池中的同一个“hello”字符串对象。
- 使用
new
关键字方式(String str2 = new String("hello");
)- 创建机制:使用
new
关键字创建字符串时,会在堆内存中创建一个新的字符串对象。首先,同样会在字符串常量池中查找是否存在内容为“hello”的字符串对象,如果不存在则在常量池中创建一个“hello”字符串对象。然后,无论常量池中是否存在,都会在堆内存中创建一个新的字符串对象,其内容也是“hello”,并返回堆中这个新对象的引用。 - 存储机制:常量池中会有一个“hello”字符串对象(如果之前不存在则创建),同时堆内存中会有一个新的字符串对象,通过
new
创建的对象在堆中。例如String str2 = new String("hello");
,常量池中有“hello”对象,堆中也有一个内容为“hello”的新对象,str2指向的是堆中的这个新对象。
- 创建机制:使用