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
暂无评论内容