从JVM指令看String对象的比较

在翻看各类 java 知识中,总会提到如下知识:比较 String 对象,例如:

String a1=new String("10");
String a2="10";
String a3="1"+"0";//结果
System.out.println(a1==a2); //false
System.out.println(a2==a3); //true

在刚学习 java 知识的时候,对于这个结果感到非常意外且不理解,还曾一度尝试去死记硬背。虽然网上的文章也有对此分析居多,但是在接触 JVM 后,发现原因其实非常简单。

在将代码编译成的字节码后,便能看出来:

 0 new #7 <java/lang/String>   //创建一个String对象,并将其引用值压入栈顶3 dup  //复制栈顶值(即String对象的引用)4 ldc #9 <10>  //将String常量值"10"从常量池推送到栈顶6 invokespecial #11 <java/lang/String.<init> : (Ljava/lang/String;)V>  //调用java.lang.String#String(java.lang.String)构造方法9 astore_1  //将栈顶引用型数值(即String对象的引用)存入第一个本地变量
10 ldc #9 <10>  //将String常量值"10"从常量池推送到栈顶
12 astore_2  //将栈顶引用型数值(即常量值"10")存入第二个本地变量
13 ldc #9 <10>  //将String常量值"10"从常量池推送到栈顶
15 astore_3  //将栈顶引用型数值(即常量值"10")存入第三个本地变量

查看常量池,可知 #9 指向了 constant_String_info String 常量池,存储值为 10。

从字节码可知,变量 a1 是基于 String 常量值创建的 String 对象,而 a2a3 则是指向同一个 String 常量的引用。因此使用 = 比较的话,a1a2a3 并不相等,而 a2a3 相等。

顺便说一句,也有一个同样关于 String 对象的问题,就是说下面代码创建了多少个 String 对象:

String a1=new String("10");
String a2=new String("10");

如果常量池中不存在 String 常量值 “10”,jvm 会先创建一个 String 对象,再放到常量池中。然后再基于常量池中的 String 常量 “10”,分别创建 a1a2 对象,由此可知,上面代码创建了 3 个对象。

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

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

相关文章

Django接口返回JSON格式数据报文

目录 遇到问题 Django返回json结构报文 不可行方式python json 可行方式JsonResponseQuerySet.values()。 python的两个web框架&#xff0c;flask和django&#xff0c;两者都具有view 模板的章节&#xff0c;但是当前开发一个应用&#xff0c;大部分采用前后端分离的合作方式。…

Vscode python Debug环境异常Timed out waiting for launcher to connet

文章目录 launch.json配置console launch.json配置console {"configurations": [{"name": "Python: Current File","type": "python","request": "launch","program": "${file}",…

Web3D之简介

参考资料 什么是Web3D&#xff1f;Web3D技术发展历程以及Web3D应用场景在Web中用上3D技术-Spline 「What」什么是 Web3D&#xff1f; Web3D是指在Web浏览器中展示和交互的三维图形技术。它是将三维图形技术与Web技术相结合的产物&#xff0c;可以通过浏览器在网页上呈现出逼…

HBase有写入数据,页面端显示无数据量

写了一个测试类&#xff0c;插入几条数据&#xff0c;测试HBase的数据量。很简单的功能&#xff0c;这就出现问题了。。网页端可以看到&#xff0c;能够看到读写请求&#xff0c;但是不管是内存、还是磁盘&#xff0c;都没有数据。 于是就想到去HDFS查看&#xff0c;也是有数据…

ThinkPHP框架特性详解

ThinkPHP是一款用于快速开发的PHP MVC框架&#xff0c;它提供了各种有用的特性&#xff0c;用于设计和实现具有高质量、可维护性和可扩展性的Web应用程序。这篇文章将深入探讨ThinkPHP的一些关键特性。 1. MVC架构 MVC架构是ThinkPHP的核心组成部分&#xff0c;它代表模型(Mod…

【C++】总结5

文章目录 初始化列表explicit和mutable友元内部类 初始化列表 在构造函数中&#xff0c;我们可以给对象一个初始值&#xff0c;但是不能将其称作为类对象成员的初始化&#xff0c;构造函数体中的语句只能将其称为赋初值&#xff0c;而不能称作初始化。因为初始化只能初始化一次…

windows命令行

参考:https://blog.csdn.net/u014419722/article/details/130427423 1、 创建文件夹&#xff08;mkdir或md&#xff09; 创建单个文件&#xff1a;mkdir cmd_test 创建二级文件&#xff1a;mkdir cmd_test\456\123 创建多个文件&#xff1a;mkdir cmd_test\000 cmd_test\111 2…

解决openstack重启swift服务后报错

swift重启报错 问题描述解决办法 问题描述 swift服务正常状态如下 [rootcontroller ~]# swift statAccount: AUTH_8bde12ff804e42498661b7454994c446Containers: 0Objects: 0Bytes: 0X-Put-Timestamp: 1690507907.67931X-Timestamp: 1690507907.67931X-Trans-Id: tx56d22fa13…

idea快速运行vue项目

目录 一、前提 二、步骤 安装vue.js插件 添加脚本 进行如下配置 一、前提 安装好node.js环境并初始化完成和安装好依赖 二、步骤 安装vue.js插件 打开idea,然后在File–Settings–Plugins–Makerplace下找到vue.js插件,安装并重启idea 添加脚本 进行如下配置 在Sctipts中根…

Linux复习——基础知识

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 1. 有关早期linux系统中 sysvin的init的7个级别描述正确的是( )[选择1项] A. init 1 关机状态 B. init 2 字符界面多用户模式 …

【MySQL进阶(三)】 InnoDB体系架构之内存池(buffer pool)

InnoDB体系架构之内存池 一、InnoDB 体系结构二、缓冲池 buffer pool内部结构free 链&#xff08;管理空闲缓冲页&#xff09;怎么知道数据页是否被缓存&#xff1f; flush 链表&#xff08;管理脏页&#xff09;1. 脏页2. 链表结构3. 刷盘时机 LRU 链表&#xff08;控制数据热…

影视行业案例 | 燕千云助力大地影院集团搭建智能一体化IT服务管理平台

影视行业过去三年受新冠肺炎疫情影响&#xff0c;经历了一定程度的冲击和调整&#xff0c;但也展现出了强大的韧性和潜力。2023年中国影视产业规模可能达到2600亿元左右&#xff0c;同比增长11%左右。影视行业的发展趋势主要表现在内容创新、模式创新和产业融合三个方面&#x…

ICC2如何计算Gate Count?

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f;知识星球入口 我们认为gate count等于standard cell(非physical only)总面积 / 最小驱动二输入与非门面积。 ICC2没有专门的命令去报告gate count&#xff0c;只能自己计算&#xff0c;使用report_d…

Jasper裁员,成也GPT,败也GPT

大家好&#xff01; 我是老洪。 今天来聊一聊人工智能(artificial intelligence)&#xff0c;简称AI。 当前的AI可谓是热火朝天&#xff0c; 自从ChatGPT发布以来&#xff0c;引起了广泛的关注和热情&#xff0c; 许多公司和研究者都试图将其应用于自己的产品或研究中。 按理说…

Redis高级篇之布隆过滤器

版本 SpringBoot 2.6.1Mybatis-Plus 3.5.3.1Guava 23.0 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

面试题:什么是闭包?

一、怎么理解闭包&#xff1f; 简单理解&#xff1a;闭包 内层函数 外层函数的变量 下面是一组简单的闭包代码&#xff1a; function outer() {let count 1function inner() {console.log(count)}inner() } outer()闭包有两个注意点&#xff1a; 闭包一定有return吗&#x…

如何利用设备数字化平台推动精益制造?

人工智能驱动技术的不断发展&#xff0c;尤其是基于机器学习的预测分析工具的使用&#xff0c;为制造业带来了全新的效率和价值水平。一直以来&#xff0c;精益生产&#xff08;也叫精益制造&#xff09;在制造业中扮演着重要角色&#xff0c;而现在通过与工业 4.0的融合&#…

word怎么转换成pdf?分享几种转换方法

word怎么转换成pdf&#xff1f;将Word文档转换成PDF文件有几个好处。首先&#xff0c;PDF文件通常比Word文档更容易在不同设备和操作系统上查看和共享。其次&#xff0c;PDF文件通常比Word文档更难以修改&#xff0c;这使得它们在需要保护文件内容的情况下更加安全可靠。最后&a…

【无标题】python和Java 企业微信群发消息

python企业微信群发消息 GitHub - LinuxSuRen/phoenix.webui.framework: 基于WebDriver的WebUI自动化测试框架 #! -*- coding: utf-8 -*- """ Author: ZhenYuSha Create type_time: 2020-2-24 Info: 定期向企业微信推送消息 """ import reques…

Java 实现冒泡排序

Java 实现冒泡排序 一、原理二、代码实现三、运行结果 一、原理 冒泡排序是一种简单但效率较低的排序算法。其核心思想是通过相邻元素之间的比较和交换来逐渐将最大的元素“冒泡”到列表的最后。每一轮比较都会确定一个最大的元素的位置&#xff0c;因此需要进行 n-1 轮比较&a…