别再问我 new 字符串创建了几个对象了!我来证明给你看!(上)

简介: 别再问我 new 字符串创建了几个对象了!我来证明给你看!

我想所有 Java 程序员都曾被这个 new String 的问题困扰过,这是一道高频的 Java 面试题,但可惜的是网上众说纷纭,竟然找不到标准的答案。有人说创建了 1 个对象,也有人说创建了 2 个对象,还有人说可能创建了 1 个或 2 个对象,但谁都没有拿出干掉对方的证据,这就让我们这帮吃瓜群众们陷入了两难之中,不知道到底该信谁得。


但是今天,老王就斗胆和大家聊聊这个话题,顺便再拿出点证据


以目前的情况来看,关于 new String("xxx") 创建对象个数的答案有 3 种:


  1. 有人说创建了 1 个对象;
  2. 有人说创建了 2 个对象;
  3. 有人说创建了 1 个或 2 个对象。


而出现多个答案的关键争议点在「字符串常量池」上,有的说 new 字符串的方式会在常量池创建一个字符串对象,有人说 new 字符串的时候并不会去字符串常量池创建对象,而是在调用 intern() 方法时,才会去字符串常量池检测并创建字符串。


那我们就先来说说这个「字符串常量池」。


字符串常量池


字符串的分配和其他的对象分配一样,需要耗费高昂的时间和空间为代价,如果需要大量频繁的创建字符串,会极大程度地影响程序的性能,因此 JVM 为了提高性能和减少内存开销引入了字符串常量池(Constant Pool Table)的概念。


字符串常量池相当于给字符串开辟一个常量池空间类似于缓存区,对于直接赋值的字符串(String s="xxx")来说,在每次创建字符串时优先使用已经存在字符串常量池的字符串,如果字符串常量池没有相关的字符串,会先在字符串常量池中创建该字符串,然后将引用地址返回变量,如下图所示:


image.png


以上说法可以通过如下代码进行证明:


public class StringExample {
    public static void main(String[] args) {
        String s1 = "Java";
        String s2 = "Java";
        System.out.println(s1 == s2);
    }
}


以上程序的执行结果为:true,说明变量 s1 和变量 s2 指向的是同一个地址。


在这里我们顺便说一下字符串常量池的再不同 JDK 版本的变化。


常量池的内存布局


JDK 1.7 之后把永生代换成的元空间,把字符串常量池从方法区移到了 Java 堆上


JDK 1.7 内存布局如下图所示:


image.png


JDK 1.8 内存布局如下图所示:


image.png


JDK 1.8 与 JDK 1.7 最大的区别是 JDK 1.8 将永久代取消,并设立了元空间。官方给的说明是由于永久代内存经常不够用或发生内存泄露,会爆出 java.lang.OutOfMemoryError: PermGen 的异常,所以把将永久区废弃而改用元空间了,改为了使用本地内存空间,官网解释详情:http://openjdk.java.net/jeps/122

相关文章
|
消息中间件 持续交付 Docker
Docker与微服务:构建和部署微服务架构的完整指南
微服务架构已经成为现代应用开发的主要范式之一,而Docker容器技术则为微服务的构建、部署和管理提供了理想的解决方案。本文将深入探讨如何使用Docker构建和部署微服务架构,提供更多示例代码和细致的指南,以帮助大家更全面地理解和运用这些关键概念。
|
SQL 消息中间件 JSON
微服务开发系列——第一篇:项目搭建(保姆级教程)
本节实现目标 搭建ac-mall2-cloud微服务基础骨架。 搭建微服务子项目:mall-pom、mall-common、mall-member、mall-product。 MyBatis-Plus配置:雪花ID、创建时间/修改时间 自动填充。 单个微服务子项目Swagger配置及访问。 返回JSON数据日期格式化。 Swagger优化:mall-common支持多个微服务Swagger配置、Swagger传参(语言参数、token、测试账号)
|
SQL 存储 关系型数据库
面试突击:MVCC 和间隙锁有什么区别?
面试突击:MVCC 和间隙锁有什么区别?
371 0
|
设计模式 消息中间件 运维
为什么用元空间替代永久代?
为什么用元空间替代永久代?
360 0
|
IDE Java 程序员
99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!(上)
99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!(上)
293 0
99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!(上)
|
存储 JavaScript
你必须知道的session与cookie
Session本质 提到Session我们能联想到的就是用户登录功能,而本身我们使用Session的基础是通过url进行访问的,也就是使用http协议进行访问的,而http协议本身是无状态的,那么问题来了服务器端是怎么验证客户端身份的? 答:服务器端和客户端验证的联系就是sessionid,登录成功之后服务器会自动给客户端一个session标识也就是sessionid,而sessionid会存储到客户端的cookie里面,每次请求的时候都会带上这个标识,用来让服务器端验证身份的。
1455 0
工作了八年,我准备去上海了
  2008年来西安,一眨眼的功夫快十年了。也是从08年开始接触软件这个行业,从刚开始的懵懂无知,因为进北大青鸟很长一段时间,我也不知道“软件”到底是啥?自己想不明白给别人也讲不清楚,那时候只是单纯的觉得,计算机是以后发展的趋势,我想要做游戏,然后北大青鸟的咨询师告诉我,你的这些愿望只要来了这里都都可以实现!现在想想自己当初确实单纯,但所幸的是,我遇到了一个好时代,智能时代的到来,给予我们这些码农带来了一波红利,让我能在十年后的今天,依然无悔于当初的选择,即使我现在没能如愿以偿的做游戏(苦笑)。
1476 0
|
16天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
5925 30
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
1天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
568 135