String str = “i”; 从常量池获取或创建对象,而 String str = new String(“i”); 总在堆中新建对象;2. 前者高效节省内存,后者可能重复创建浪费资源;3. 前者相同值引用相等,后者不相等;4. 推荐优先使用字面量方式创建字符串。

String str = “i”; 和 String str = new String(“i”); 不一样,主要区别在于对象的创建方式和内存分配。
1. 字符串常量池 vs 堆内存
当使用 String str = “i”; 时,jvm 会检查字符串常量池中是否已经存在内容为 “i” 的字符串。如果存在,就直接返回该引用;如果不存在,就在常量池中创建一个新对象,并让 str 指向它。这种方式不会在堆中额外创建对象。 而使用 String str = new String(“i”); 时,无论常量池中有没有 “i”,都会在堆中创建一个新的 String 对象。同时,如果常量池中没有 “i”,还会在常量池中创建一份。
2. 内存占用与性能
new String(“i”) 的方式效率较低,因为它可能导致重复创建相同内容的对象,浪费内存。例如:
-  
String a = "i";—— 只涉及常量池 -  
String b = new String("i");—— 在堆中新建对象,可能也在常量池中创建 
推荐优先使用 String str = “i”;,更高效且符合 Java 的字符串优化机制。
3. 引用比较结果不同
由于创建方式不同,两者在 == 比较时表现不一样:
String a = "i";String b = "i";a == b; // true,指向常量池同一个对象String c = new String("i");String d = new String("i");c == d; // false,堆中两个不同的对象
4. 使用建议
除非明确需要一个全新的、独立的字符串对象(比如防止后续修改影响),否则应使用 String str = “i”;。这是标准写法,也利于 JVM 优化。 基本上就这些,不复杂但容易忽略。


