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

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定