从JVM指令看String对象的比较

这篇具有很好参考价值的文章主要介绍了从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 个对象。文章来源地址https://www.toymoban.com/news/detail-600129.html

到了这里,关于从JVM指令看String对象的比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JVM】详细解析java创建对象的具体流程

    目录 一、java创建对象的几种方式 1.1、使用new  1.2、反射创建对象 1.2.1、Class.newInstance创建对象 1.2.2、调用构造器再去创建对象Constructor.newInstance  1.3、clone实现 1.4、反序列化 二、创建对象的过程 2.1、分配空间的方式 1、指针碰撞 2、空闲列表 3、怎么选择分配方式 三、

    2024年02月15日
    浏览(47)
  • 深入理解Java虚拟机jvm-对象的内存布局

    在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例 数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机对象的对象头部分包括两类信息。第一类是用于存储对象自身的运行时数据,如哈 希码(HashCode)、GC分代年龄、锁状态标志、

    2024年02月09日
    浏览(43)
  • 【JVM】Java堆 :深入理解内存中的对象世界

    人不走空                                                                            目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 ​编辑 什么是Java堆? 作用和特点 1. 存储对象实例 2. 垃圾收集 3. 对象

    2024年01月19日
    浏览(44)
  • 深入理解JVM:Java使用new创建对象的流程

            ①new 对象         ②反射         ③对象的复制         ④反序列化 先看看常量池里面有没有,如果有,就用常量池的 看这个类有没有被加载过,如果没有,就执行类加载以及类的初始化。(对象的大小,在类加载的时候就确定了)。 对象在堆内存

    2024年02月15日
    浏览(55)
  • Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    1.java运行时的内存分配,创建对象时内存分配; 2.类加载的顺序,创建一个唯一的类的类对象; 3.创建对象的方式,new,Class.forName,clone; 4.什么时候加载.class文件进入JVM内存中,看到new,Class.forName; 5.如何加载?双亲委托(委派)机制:安全;AppClassLoader; 6.反射实质:能

    2024年02月14日
    浏览(34)
  • 【JVM】JVM常用指令

    性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、

    2024年02月08日
    浏览(27)
  • JVM CMS和G1执行过程比较

    CMS CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。由于大部分 Java 应用主要集中在互联网网站以及基于浏览器的 B/S 系统的服务端,这类应用通常会较为关注服务的响应速度,希望系统的停顿时间尽可能少,CMS 收集器就非常符合这类应用的需求

    2024年02月07日
    浏览(26)
  • JVM调优指令&参数

    常用命令查找文档站点:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html 输出所有参数的名称和默认值,默认不包括Diagnostic和Experimental的参数。可以配合  -XX:+UnlockDiagnosticVMOptions 和 -XX:UnlockExperimentalVMOptions 使用 注意: 这里列举出来的所有参数值,大体分为两类。一类

    2024年02月10日
    浏览(28)
  • JVM指令手册

    指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至操作数栈顶 0x06 iconst_3 将int型3推送至栈顶 0x07 iconst_4 将int型4推送至栈顶 0x08 iconst_5 将

    2023年04月17日
    浏览(23)
  • Jvm对象回收算法-JVM(九)

    上篇文章介绍了jvm运行时候对象进入老年代的场景,以及如何避免频繁fullGC。 Jvm参数设置-JVM(八) 老年代分配担保机制 这个机制的目的是为了提升效率,在minorGC之前,会有三次判断,之后再次minorGC速度会很快。 老年代剩余空间是否 大于 年轻代里现在所有对象 大于的话则

    2024年02月13日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包