前言
这道题是我之前的面试题文章《Java 基础高频面试题(2021年最新版)》里的第10题,今天通过字节码和流程图来跟大家详解一下完整的执行过程。
同时也会涉及一些字符串常量池的相关知识,这块内容网上现在的说法有太多错误了。
本文内容有视频版本,喜欢看视频的同学可以直接通过下面的链接观看。如果你对文章的内容有疑惑,可以先看视频的对应内容,视频可能讲的会更细一点。
答案
首先直接说答案,一个比较合理的答案是:一个或者两个字符串对象,通常这个也是面试官想要听到的答案。
首先,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 对象,但是此时还未初始化,是一个空对象。同时,这个字节