面试题:String str=”i” 与 String str = new String(“i”)一样吗 ?

String str = "i" 和 String str = new String("i") 在 Java 中看起来相似,但它们在内存分配和性能上有显著区别。以下是详细分析:


1. String str = "i"

  • 这种方式会使用 字符串常量池(String Pool)
  • JVM 首先检查字符串常量池中是否存在值为 "i" 的字符串:
    • 如果存在,则直接返回常量池中的引用。
    • 如果不存在,则在常量池中创建一个新的字符串对象,并返回其引用。
  • 特点
    • 节省内存,因为相同的字符串字面量会共享同一个对象。
    • 性能更高,因为避免了重复创建对象。

示例

String str1 = "i";
String str2 = "i";
System.out.println(str1 == str2); // true,因为 str1 和 str2 指向常量池中的同一个对象

2. String str = new String("i")

  • 这种方式会显式创建一个新的字符串对象,无论字符串常量池中是否已经存在相同的字符串。
  • JVM 首先在堆内存中创建一个新的 String 对象,然后将字面量 "i" 存储到字符串常量池中(如果尚未存在)。
  • 特点
    • 每次调用都会创建一个新的对象,即使内容相同。
    • 内存开销较大,因为相同的字符串可能会被重复创建。
    • 性能较低,因为需要分配新的堆内存。

示例

String str1 = new String("i");
String str2 = new String("i");
System.out.println(str1 == str2); // false,因为 str1 和 str2 是两个不同的对象

3. 内存分配对比

  • String str = "i"
    • 字符串常量池中存储一个 "i" 对象。
    • 所有引用该字面量的变量共享同一个对象。
  • String str = new String("i")
    • 堆内存中创建一个新的 String 对象。
    • 字符串常量池中也可能存储一个 "i" 对象(如果尚未存在)。
    • 每次调用都会创建一个新的堆内存对象。

4. 性能与使用场景

  • String str = "i"
    • 适用于字符串内容固定且需要频繁使用的场景。
    • 例如:常量字符串、配置项等。
  • String str = new String("i")
    • 适用于需要显式创建独立对象的场景。
    • 例如:需要修改字符串内容(通过反射或其他方式)。

5. 总结

特性String str = "i"String str = new String("i")
内存分配字符串常量池堆内存
对象共享相同字面量共享同一个对象每次调用创建一个新对象
性能更高较低
适用场景常量字符串、频繁使用的字符串需要独立对象的场景

因此,String str = "i" 和 String str = new String("i") 不一样,它们在内存分配、对象共享和性能上有明显区别。在大多数情况下,推荐使用 String str = "i",因为它更高效且节省内存。

THE END
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容