(❁´◡`❁)您的点赞➕评论➕收藏⭐是作者创作的最大动力
支持我:点赞+收藏⭐️+留言欢迎留言讨论
(源码 + 调试运行 + 问题答疑) 有兴趣可以联系我
文末有往期免费源码,直接领取获取(无删减,无套路)
在 Java 中,代码 String s = new String("java");
(注意:正确的类名是 String
,首字母大写)会创建 1 个或 2 个对象,具体取决于字符串常量池(String Pool)的当前状态。以下是详细分析:
Java 有一个字符串常量池,它在堆内存中,用于存储唯一的字符串字面量(如 "java"
),以避免重复创建相同字符串,节省内存。
字符串字面量(例如 "java"
)在类加载时会被自动放入字符串常量池(如果池中尚不存在)。
情况 1:如果字符串常量池中没有 "java"
(第一次使用该字面量):
类加载时,字符串字面量 "java"
会被创建并放入字符串常量池(创建 第 1 个对象)。
执行 new String("java")
时,会在堆内存中创建一个新的 String
对象(创建 第 2 个对象),这个对象独立于常量池。
总共创建 2 个对象。
示例:如果这是程序第一次出现 "java"
,则创建两个对象。
情况 2:如果字符串常量池中已有 "java"
(例如,之前代码使用过该字面量):
字符串字面量 "java"
已经存在,不会创建新对象(直接复用池中的对象)。
执行 new String("java")
时,只在堆内存中创建一个新的 String
对象(创建 第 1 个对象)。
总共创建 1 个对象。
示例:如果之前有代码如 String temp = "java";
,则常量池已有 "java"
,这里只创建一个新对象。
字符串常量池的对象:由字面量 "java"
隐式创建(类加载阶段),它是不可变的,并被所有引用共享。
堆上的对象:由 new String("java")
显式创建,它是一个独立的新对象,内容与 "java"
相同,但不在常量池中(除非调用 intern()
方法)。
变量 s
:s
只是一个引用(不是对象),指向堆上创建的新 String
对象。
为什么结果不确定? 字符串常量池是全局的,如果程序其他部分已使用 "java"
,则池中对象已存在,不会重复创建。
"java"
)字符串常量池: [String对象1: "java"] // 类加载时创建
堆内存: [String对象2: "java"] // new String() 执行时创建
引用 s: 指向堆内存中的 String对象2
在大多数情况下,避免使用 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宠物商城网站系统
(❁´◡`❁)您的点赞➕评论➕收藏⭐是作者创作的最大动力
支持我:点赞+收藏⭐️+留言欢迎留言讨论
(源码 + 调试运行 + 问题答疑)
有兴趣可以联系我