String sb = new String(sb);到底创建了几个实例?

2024-08-29 16:48

本文主要是介绍String sb = new String(sb);到底创建了几个实例?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

String sb = new String(“sb”);到底创建了几个实例?

很多人都在讨论这个问题,当然这个问题是没有什么意义的。但是如果可以学到新的知识,那讨论便有了意义。

之前博主不知道如何查看字节码,最近看了一些文章。本文将从字节码的角度分析这个问题。

对于这个问题,不考虑特殊情况是2个。
1.一个是字符串字面量”sb”所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例。
2.通过new String(String)创建并初始化的、内容与”sb”相同的实例。

下面我们通过例子来感知下。
很简单的例子。

这里写图片描述

通过:

javac identity.java.

然后:

对生成的identity.class字节码文件进行反汇编。
javap指令。

javap -c identity.class

结果如下图:
这里写图片描述

这就是字节码执行的步骤。

先看下java指令的意思。
1.new 创建一个对象,并将其引用值压入栈顶
2.dup 复制栈顶数值并将复制值压入栈顶
3.ldc 将int, float或String型常量值从常量池中推送至栈顶
4.invokespecial 调用超类构造方法,实例初始化方法,私有方法(初始化)
5.putfield 为指定的类的实例域赋值

而对于我们重要的就是
new和ldc指令。new执行了一次,创建了String对象。ldc执行了一次,从常量池中推送至栈顶。

很明显,有两个。

通过字节码的解释到此结束。

链接

java指令表格

当然关于此类的讨论是没什么太多意义的,当然对于这个问题的问法,也会有不同的答案。

比如:在运行时,有几个实例。
那么这个答案就不一定了。因为不同的jvm虚拟机在编译时会做优化,所以到运行时,为了更好的运行,有些早已给gc掉了。这在不同的jvm虚拟机上可能结果是不同的。

附上大神的解释

关于问题的解释

Ending.

这篇关于String sb = new String(sb);到底创建了几个实例?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118417

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行