面试题:String s = new String(“xyz“) 创建了几个对象?

news2024/9/24 13:18:31

项目场景:

今天分享一篇基础技术面试题。
这个问题相信每个学习 java 的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为还是有必要来说一说这个问题的。


从方法区说起

常量池存在于方法区,而方法区在jdk1.7版本前后改变比较大,所以还是先来说说方法区的演变。

在jdk1.7版本之前,常量池存在于方法区,方法区是堆的一个逻辑部分,他有一个名字叫做非堆。
在这里插入图片描述
1.7版本把字符串常量池放到了堆中。
在这里插入图片描述
而在1.8以后,则是移除了永久代,方法区概念保留,方法区的实现改为了元空间,常量池还是在堆中。

在这里插入图片描述
为什么要说方法区的改变,只是为了文章接下来的内容不会由于JDK的版本而产生分歧,接下来内容都会以jdk1.8版本作为基础来讨论。

String s = new String(“xyz”);

先来一段代码:

在这里插入图片描述
接着我们javac编译代码,然后用javap来反编译,执行javap -c Test

在这里插入图片描述
从结果来看,ldc命令在常量池中创建了一个"xyz"的对象,然后把他推至操作数栈顶,然后astore保存到局部变量,return返回。

接着看第二段面试题中的代码

在这里插入图片描述
同样反编译分析

在这里插入图片描述

很明显,我们看到new 创建了一个String对象,同时ldc在常量池中创建了"xyz"字符串对象,之后invokespecial执行构造函数,astore_1赋值,return返回。

通过以上两个例子,可以知道String s = new String(“xyz”);创建了2个对象,而有些答案说的3个对象,则是把引用s也算作一个对象。

还有答案说xyz存在就创建了2个,不存在就创建了3个(包含引用s),再来测试一下。

在这里插入图片描述
在这里插入图片描述
从这里,很明显的发现这就是我们例子1和2的一个结合,但是注意两次ldc后面的#2,#号代表着索引,说明第二次new String(“xyz”)的时候并没有重新创建xyz对象。

一些常见的指令助记符含义:

1.nop, 什么都不做。

2.aconst_null,将 null 推送至栈顶。

3.iconst_i(变量数字),将 int 型 i 推送至栈顶。同理有lconst_0,fconst_0这种你应该知道什么意思了

4.ldc,将 int,float 或 String 型常量值从常量池中推送至栈顶。

5.iload,将指定的 int 型局部变量推送至栈顶。

6.istore,将栈顶 int 型数值存入指定局部变量。同理astore_i代表将栈顶引用型数值存入第i个局部变量。

7.dup,复制栈顶数值并将复制值压入栈顶。

8.invokevirtual,调用实例方法。

9.invokespecial,调用超类构造方法,实例初始化方法,私有方法。

10.invokestatic,调用静态方法。

11.invokeinterface,调用接口方法。

12.invokedynamic,调用动态链接方法。

13.new,创建一个对象,并将其引用值压入栈顶。


总结

到底创建了几个对象呢?

1.如果xyz不存在,引用算对象的话,那就是3个

2.如果xyz不存在,引用不算对象的话,那就是2个

3.如果xyz存在,引用算对象的话,那就是2个

4.如果xyz存在,引用不算对象的话,那就是1个

当然,我认为引用肯定是不算对象的,最终答案应该是1或者2个,这个面试题说实话不应该出现在初级面试题里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1408967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

酷开科技 | 酷开系统体育频道燃爆体育赛事,为偶像疯狂打CALL

体育竞技,总会带给我们激情澎湃的感受,兴奋、激动、热血,这些瞬间也许就是竞技体育的魅力!酷开科技通过酷开系统的体育频道,为广大体育迷们提供了一个观赛平台。在这个平台上,你可以欣赏到各类体育赛事的精…

用JavaFX写了一个简易的管理系统

文章目录 前言正文一、最终效果1.1 主页面1.2 动物管理页面-初始化1.3 动物管理页面-修改&新增1.4 动物管理页面-删除&批量删除 二、核心代码展示2.1 启动类2.2 数据库配置-db.setting2.3 日志文本域组件2.4 自定义表格视图组件2.5 自定义分页组件2.6 动物管理页面2.7 …

JVM/GC复习1---更新中

JVM/GC JVMGC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器(重点)jdk1.7开始1.9默认的回收器Young GC模式Mixed GCFull GC JVM 待更新中ing GC 垃圾回收:程序运行的时候必…

2024年美赛数学建模思路 - 案例:异常检测

文章目录 赛题思路一、简介 -- 关于异常检测异常检测监督学习 二、异常检测算法2. 箱线图分析3. 基于距离/密度4. 基于划分思想 建模资料 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 一、简介 – 关于异常…

【JSON2WEB】03 go的模板包html/template的使用

Go text/template 是 Go 语言标准库中的一个模板引擎,用于生成文本输出。它使用类似于 HTML 的模板语言,可以将数据和模板结合起来,生成最终的文本输出。 Go html/template包实现了数据驱动的模板,用于生成可防止代码注入的安全的…

一文掌握Shell

文章目录 Shell概述脚本的常用执行方式Linux中的sh解释器Linux中的/etc 编写sh脚本第一个sh脚本变量1. 系统预定义变量2. 自定义变量3. 变量定义规则单引号和双引号的区别 4. 特殊变量 运算符命令替换条件判断常用判断语句 流程控制if语句case语句while循环 read读取控制台输入…

生产、计划、仓库、质量,一大堆的工厂数据要怎么收集?MES系统替你解决!

随着制造业的发展和进步,工厂运营面临着越来越多的挑战,特别是在数据管理和生产过程控制方面。生产、计划、仓库、质量等方面的数据分散在各个系统和部门中,数据的收集和分析变得复杂而困难。然而,MES系统为工厂提供了一个综合性解…

成功安装DCNv4

最终结果 终于安装成功了。 环境 系统:ubuntu22.04 CUDA:12.1 python:3.11 显卡驱动:545 安装过程 系统、CUDA和python的安装过程忽略,这些都能找到。这里只写不同的地方。 配置CUDAHOME 执行命令“ gedit ~/…

余弦定理是怎么推导的?

余弦定理是怎么推导的? 已知余弦定理(low of cosines)表达如下: A B 2 = B C 2 + A C 2 − 2 B C ∗ A C ∗ cos ⁡ θ AB^2=BC^2+AC^2-2BC*AC*\cos \theta AB2=BC2+AC2−2BC∗AC∗cosθ,其中 A B , B C , A C AB,BC,AC AB,BC,AC和 θ \theta θ的关系如下: 那么这个公式是…

数据库缓存策略

数据库缓存策略 以下是数据库与缓存的五种常见策略。 1缓存旁路 缓存旁路(Cache-Aside) 在缓存旁路策略中,数据库缓存位于数据库旁边。当应用程序请求数据时,它会首先检查缓存 如果缓存中存在数据(缓存命中&#xff…

风速预测 | Python基于CEEMDAN-CNN-Transformer+ARIMA的风速时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CEEMDAN-CNN-TransformerARIMA是一种用于风速时间序列预测的模型,结合了不同的技术和算法。收集风速时间序列数据,并确保数据的质量和完整性。这些数据通常包括风速的观测值和时间戳。CEEMDAN分…

SpringCloudAlibaba系列之Nacos实战

目录 注意事项 参考资源 Nacos配置中心 初始化项目 进行Nacos相关配置 运行 Nacos注册中心 dubbo方式 对外暴露接口dubbo-api 服务提供者dubbo-provider 服务消费者dubbo-consumer 负载均衡客户端方法 服务提供者 服务消费者 注意事项 不管是使用Nacos配置中心&…

使用POI生成word文档的table表格

文章目录 使用POI生成word文档的table表格1. 引入maven依赖2. 生成table的两种方式介绍2.1 生成一行一列的table2.2 生成固定行列的table2.3 table合并列2.4 创建多个table存在的问题 使用POI生成word文档的table表格 1. 引入maven依赖 <dependency><groupId>org.…

智能家居20年,从「动手」到「用脑」

【潮汐商业评论/原创】 正在装修新家的Carro最近陷入了纠结之中&#xff0c;“还没想好要怎么装一套完整的智能家居&#xff0c;家里的基装就已经开始了。” 事实上&#xff0c;Carro对智能家居也不了解&#xff0c;并不知道该如何下手&#xff0c;心想“要是能一次性设计好就…

鸿蒙常用UI效果及一些处理方式总结

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 详细使用介绍 1、Text的一些常用设置 Text(this.message).fontSize(50)//字体大小.fontColor(Color.White)//字体颜色.fontWeight(FontWeight.Bold)//字体加粗.backgroundColor(Color.Black)//背景颜色.fontStyle(…

利用Python实现科学式占卜

一直以来,中式占卜都是基于算命先生手工实现,程序繁琐(往往需要沐浴、计算天时、静心等等流程)。准备工作复杂(通常需要铜钱等道具),计算方法复杂,需要纯手工计算二进制并转换为最终的卦象,为了解决这个问题,笔者基于python实现了一套科学算命工具,用于快速进行占卜…

IDEA导出jar

1、选择导出方式 2、选择Main Class 3、构建jar

数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)七

第五部分、数组和广义表详解 数组和广义表&#xff0c;都用于存储逻辑关系为“一对一”的数据。 数组存储结构&#xff0c;99% 的编程语言都包含的存储结构&#xff0c;用于存储不可再分的单一数据&#xff1b;而广义表不同&#xff0c;它还可以存储子广义表。 本章重点从矩阵…

java复习篇 数据结构:链表第二节 哨兵

目录 单向链表哨兵 初始 头插 思路 代码 尾插 思路 遍历 遍历验证头插 尾插代码 尾插测试 get 思路 代码 测试 insert 思路 代码 测试 remove 移除头结点 提问 移除指定位置 测试 单向链表哨兵 单向链表里面有一个特殊的节点称为哨兵节点&#xff0c;…

[pytorch入门] 2. tensorboard

tensorboard简介 TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中.但是也可以独立安装&#xff0c;服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…