MST

星途 面试题库

面试题:Java字符串创建与存储机制:创建方式对比

在Java中,有两种常见的创建字符串的方式,分别是直接赋值(如String str1 = "hello";)和使用new关键字(如String str2 = new String("hello");)。请详细阐述这两种创建方式在字符串创建与存储机制上有何不同。
43.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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