流程图详解 new String(“abc“) 创建了几个字符串对象

本文详细解析了Java中new String("abc")创建字符串对象的过程,涉及字符串常量池、字节码指令和实例初始化,揭示可能创建一个或两个对象的情况,并通过多个例子加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这道题是我之前的面试题文章《Java 基础高频面试题(2021年最新版)》里的第10题,今天通过字节码和流程图来跟大家详解一下完整的执行过程。

同时也会涉及一些字符串常量池的相关知识,这块内容网上现在的说法有太多错误了。

本文内容有视频版本,喜欢看视频的同学可以直接通过下面的链接观看。如果你对文章的内容有疑惑,可以先看视频的对应内容,视频可能讲的会更细一点。

流程图详解 new String("abc") 创建了几个字符串对象_哔哩哔哩_bilibiliicon-default.png?t=M4ADhttps://www.bilibili.com/video/BV1tL4y1F7UH

答案

首先直接说答案,一个比较合理的答案是:一个或者两个字符串对象,通常这个也是面试官想要听到的答案。

首先,new string 这边由于 new 关键字,所以这边肯定会在堆中新建一个字符串对象。

其次,如果字符串常量池中不存在 jionghui(equals比较)这个字符串,则会在字符串常量池中创建一个字符串对象。

注意:这边说的在字符串常量池创建对象,最终对象还是在堆中创建,字符串常量池只放引用。

例子1:String str1 = new String("jionghui") 

本例子按照字符串常量池中不存在 jionghui 字符串来说。

该代码编译后其字节码如下:

 0 new #2 <java/lang/String>
 3 dup
 4 ldc #3 <jionghui>
 6 invokespecial #4 <java/lang/String.<init> : (Ljava/lang/String;)V>
 9 astore_1
10 return

接下来我们解释下这些字节码

1)#2、#3、#4

字节码中这些带 # 号的数字,是我们常量池里面的符号引用,这些符号引用会在类加载的解析阶段被解析为直接引用,直接引用可以理解为就是对象在内存中的地址。

这些符号引用对应的内容在后面已经给你列出来了。

#2 这边对应的是 java.lang.String 的 Class 类

#3 对应的 jionghui 字符串

#4 对应的 String 的初始化方法

2)new

new 关键字就是新建对象的意思,这边相当于会新建一个 String 对象,但是此时还未初始化,是一个空对象。同时,这个字节

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员囧辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值