🥂(❁´◡`❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞
💖📕🎉🔥 支持我:点赞👍+收藏⭐️+留言📝欢迎留言讨论
🔥🔥🔥(源码 + 调试运行 + 问题答疑)🔥🔥🔥 有兴趣可以联系我
🔥🔥🔥 文末有往期免费源码,直接领取获取(无删减,无套路)
在 Java 中,代码 String s = new String("java");
(注意:正确的类名是 String
,首字母大写)会创建 1 个或 2 个对象,具体取决于字符串常量池(String Pool)的当前状态。以下是详细分析:
1. 字符串常量池(String Pool)的作用
-
Java 有一个字符串常量池,它在堆内存中,用于存储唯一的字符串字面量(如
"java"
),以避免重复创建相同字符串,节省内存。 -
字符串字面量(例如
"java"
)在类加载时会被自动放入字符串常量池(如果池中尚不存在)。
2. 对象创建的场景
-
情况 1:如果字符串常量池中没有
"java"
(第一次使用该字面量):-
类加载时,字符串字面量
"java"
会被创建并放入字符串常量池(创建 第 1 个对象)。 -
执行
new String("java")
时,会在堆内存中创建一个新的String
对象(创建 第 2 个对象),这个对象独立于常量池。 -
总共创建 2 个对象。
-
示例:如果这是程序第一次出现
"java"
,则创建两个对象。
-
-
情况 2:如果字符串常量池中已有
"java"
(例如,之前代码使用过该字面量):-
字符串字面量
"java"
已经存在,不会创建新对象(直接复用池中的对象)。 -
执行
new String("java")
时,只在堆内存中创建一个新的String
对象(创建 第 1 个对象)。 -
总共创建 1 个对象。
-
示例:如果之前有代码如
String temp = "java";
,则常量池已有"java"
,这里只创建一个新对象。
-
3. 关键点说明
-
字符串常量池的对象:由字面量
"java"
隐式创建(类加载阶段),它是不可变的,并被所有引用共享。 -
堆上的对象:由
new String("java")
显式创建,它是一个独立的新对象,内容与"java"
相同,但不在常量池中(除非调用intern()
方法)。 -
变量
s
:s
只是一个引用(不是对象),指向堆上创建的新String
对象。 -
为什么结果不确定? 字符串常量池是全局的,如果程序其他部分已使用
"java"
,则池中对象已存在,不会重复创建。
4. 图示示例(假设第一次使用 "java"
)
字符串常量池: [String对象1: "java"] // 类加载时创建
堆内存: [String对象2: "java"] // new String() 执行时创建
引用 s: 指向堆内存中的 String对象2
5. 最佳实践
-
在大多数情况下,避免使用
new String(String)
构造函数创建字符串,因为它可能创建不必要的重复对象(浪费内存)。直接使用字面量(如String s = "java";
)更高效,它只会使用常量池中的对象(0 或 1 个对象创建)。 -
如果代码是孤立的(例如,在面试或测试中),通常假设字符串字面量是第一次使用,因此 默认答案是创建 2 个对象。
总结
-
通常创建 2 个对象(常量池中的对象 + 堆上的新对象),但严格取决于常量池状态。
-
在代码
String s = new String("java");
执行时:-
堆上一定创建 1 个新对象(由
new
触发)。 -
常量池对象可能创建(如果不存在)或不创建(如果已存在)。
-
往期免费源码 (无删减,无套路):🔥🔥🔥
https://pan.baidu.com/s/1sjAr08PU9Xe7MQf1gjGM5w?pwd=6666
「在线考试系统源码(含搭建教程)」 (无删减,无套路):🔥🔥🔥
链接:https://pan.quark.cn/s/96c4f00fdb43 提取码:WR6M
往期免费源码对应视频:
免费获取--SpringBoot+Vue宠物商城网站系统
🥂(❁´◡`❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞
💖📕🎉🔥 支持我:点赞👍+收藏⭐️+留言📝欢迎留言讨论
🔥🔥🔥(源码 + 调试运行 + 问题答疑)
🔥🔥🔥 有兴趣可以联系我