admin管理员组文章数量:1037775
new String之后会创建几个对象
在 Java 中,使用 new String("abc")
创建字符串对象时,是否创建两个对象取决于字符串常量池中是否已存在 "abc"。以下是具体分析:
- 创建两个对象的情况
当字符串常量池中不存在 "abc" 时,执行 new String("abc")
会创建两个对象:
- 对象1(字符串常量池):字面量 "abc" 会被存入字符串常量池(JDK 1.7+ 后常量池位于堆中)。
- 对象2(堆内存):
new
关键字会在堆中创建一个新的String
对象,内容复制自常量池中的 "abc"。
示例:
代码语言:javascript代码运行次数:0运行复制String s = new String("abc");
此时内存中生成两个对象:
- 字符串常量池中的 "abc"。
- 堆内存中由
new
生成的新String
对象 - 仅创建一个对象的情况
当字符串常量池中已存在 "abc" 时,执行 new String("abc")
仅创建一个对象:
- 对象(堆内存):
new
在堆中创建新的String
对象,但不会重复生成常量池中的 "abc"。
示例:
代码语言:javascript代码运行次数:0运行复制String s1 = "abc"; // 常量池生成 "abc"
String s2 = new String("abc"); // 仅堆中生成新对象
此时 s2
指向堆中的新对象,而常量池中的 "abc" 已存在
关键机制
- 字符串常量池的作用:避免重复创建相同内容的字符串,节省内存。
new
的行为:强制在堆中生成新对象,与常量池无关。即使内容相同,new
的对象地址也不同(==
比较为false
)
内存模型验证
通过以下代码可验证两种场景:
代码语言:javascript代码运行次数:0运行复制String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
s1
直接指向常量池中的 "abc"。s2
指向堆中的新对象,但内容与常量池一致
总结
- 默认行为:
new String("abc")
最多可能创建两个对象,具体取决于常量池状态。 - 优化建议:优先使用字面量赋值(
String s = "abc"
),避免不必要的堆对象开销
new String之后会创建几个对象
在 Java 中,使用 new String("abc")
创建字符串对象时,是否创建两个对象取决于字符串常量池中是否已存在 "abc"。以下是具体分析:
- 创建两个对象的情况
当字符串常量池中不存在 "abc" 时,执行 new String("abc")
会创建两个对象:
- 对象1(字符串常量池):字面量 "abc" 会被存入字符串常量池(JDK 1.7+ 后常量池位于堆中)。
- 对象2(堆内存):
new
关键字会在堆中创建一个新的String
对象,内容复制自常量池中的 "abc"。
示例:
代码语言:javascript代码运行次数:0运行复制String s = new String("abc");
此时内存中生成两个对象:
- 字符串常量池中的 "abc"。
- 堆内存中由
new
生成的新String
对象 - 仅创建一个对象的情况
当字符串常量池中已存在 "abc" 时,执行 new String("abc")
仅创建一个对象:
- 对象(堆内存):
new
在堆中创建新的String
对象,但不会重复生成常量池中的 "abc"。
示例:
代码语言:javascript代码运行次数:0运行复制String s1 = "abc"; // 常量池生成 "abc"
String s2 = new String("abc"); // 仅堆中生成新对象
此时 s2
指向堆中的新对象,而常量池中的 "abc" 已存在
关键机制
- 字符串常量池的作用:避免重复创建相同内容的字符串,节省内存。
new
的行为:强制在堆中生成新对象,与常量池无关。即使内容相同,new
的对象地址也不同(==
比较为false
)
内存模型验证
通过以下代码可验证两种场景:
代码语言:javascript代码运行次数:0运行复制String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
s1
直接指向常量池中的 "abc"。s2
指向堆中的新对象,但内容与常量池一致
总结
- 默认行为:
new String("abc")
最多可能创建两个对象,具体取决于常量池状态。 - 优化建议:优先使用字面量赋值(
String s = "abc"
),避免不必要的堆对象开销
本文标签: new String之后会创建几个对象
版权声明:本文标题:new String之后会创建几个对象 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748233998a2273100.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论