从Java虚拟机来看Java对象的等价性

100kHz手持LCR表设计:高频阻抗测量与校准实战解析 阻抗测量是电子元件测试的基础,LCR表通过施加正弦激励并分析电压电流的幅值与相位,即可获取电容、电感、电阻的等效参数。在开关电源、无线充电等高频应用场景中,元件在100kHz下的ESR和阻抗特性尤为关键,传统10kHz手持仪表难以满足需求。本文从自动平衡桥原理出发,探讨如何将台式电桥的核心能力浓缩至手持设备,重点剖析高频寄生参数抑制、模拟链路设计、数字相敏检波算法及开路短路校准方法。通过实测数据验证,在100kHz频率下基本精度可达0.5%以内,为维修现场、产线抽检及硬件调试提供了可携带的精密测量方案。全文 阅读详情

  (阅读本文需要对java虚拟机或class文件的字节码有一定的了解)
  前几天,一位正在找java开发工作的好基友来问我一个问题,代码如下,问输出什么:
  

public class Test
{
    public static void main(String [] args)
    {
        String s1="ab";
        String s2=s1+"cd";
        System.out.println("abcd"==s2);
    }
}

  一看到这个题目我就乐了,对于正在重读《Java编程思想》的我,不就是小菜一碟嘛,顺便可以小秀一把。于是,我告诉我的好基友,答案是false,Java中比较对象时,比较的是引用,尽管对象内容相同,然而对象的引用却是不同的。而==比较的就是引用,如果要比较内容必须用equal方法。然后我又说道,即使是这样的程序,输出的也是false。
  

public class Test2
{
    public static void main(String [] args)
    {
        String s1="ab";
        String s2="ab";
        System.out.println(s1==s2);
    }
}

  然而我运行了一下,结果却令我脸面全无,输出的结果竟然是true。基友这下乐了,大说我水平不行。 不过,还好毕设做的是Java虚拟机的实现,这下正好派上用场,我马上对Test2.class反编译一下(javap -verbose Test2.class),看看他的字节码是怎样的。
  
  Test2 main函数的字节码
  
   首先从字节码的第11条if_acmpne可以看出它比较的的确是引用(a比较的是引用,i比较的int,d比较的是double…)。比较的是 本地变量表中第一个和第二个本地变量(栈顶的两个),从0-5条字节码可以看出,ldc(取常量池中的)取出的均是#2,序号为2的常量String ab,而虚拟机在装载类的时候已经将符号引用转换直接引用。因此在比较两个引用的时候应该相等。我恍然大悟,又把Test.class反编译了一遍。看看它的字节码是怎么回事。
  
   Test的main函数的字节码
  
   果然不出所料,从29条字节码看出比较的也是引用。而26-28条字节码可以看出,比较的其中一个是常量池中第二个String abcd的引用。另一个变量是本地变量表2的变量,从0-22的字节码该存的是一个新new的StringBuilder对象多次调用连接append最后调用toString返回的String对象。当然比较两者内容应该相同,但引用肯定不同。所以是false。
  那么,根据Test2的结果,为什么《java编程思想》的例子是对的呢?好基友提醒了我,因为它们是new的对象。看下面的例子:
  

public class Test3
{
    public static void main(String[] args)
    {
        String s1= new String("ab");
        String s2= new String("ab");
        System.out.println(s1==s2); 
    }
}

  结果是false,字节码如下:
  
  Test3的main函数的字节码
  
  显而易见,这次new了两个对象,比较引用,肯定不相等。好吧,基友还是很厉害的。最后来看三个程序:
  

public class Test4
{
    public static void main(String[] args)
    {
        Integer a=1;
        Integer b=1;
        System.out.println(a==b);
    }
}

public class Test5
{
    public static void main(String[] args)
    {
        Integer a=255;
        Integer b=255;
        System.out.println(a==b);
    }
}

public class Test6
{
    public static void main(String[] args)
    {
        int a=255;
        int b=255;
        System.out.println(a==b);
    }
}



  Test4输出是true,Test5输出的false,Test6输出的是ture。很奇怪吧,字节码就不贴了(可以用javap -verbose XXX.class自己查看)。首先是Test6由于比较的是基本类型,字节码最后比较的是if_icmpne,也就是比较的是数值,所以是ture。那么Test4和Test5为什么不一样呢?
  作者找了很长时间也没有找到原因,最后在这位博主的博客中找到了解答,地址:http://blog.youkuaiyun.com/jeamking/article/details/6883623。原因是 Integer valueOf的源码。在-128~127范围内,用的是Integer缓存中的同一对象,所以Test4为ture,超过此范围后用的则是不同的对象。
  
  作者本以为java学的不错,没想到还是在基友面前出了丑。看来学无止境,还是要更加深入的学习和钻研。
  

从零开始:ENSP与VirtualBox的兼容性迷宫与突围指南 本文深入解析eNSP与VirtualBox的兼容性问题,特别是报错40的解决方案。从诊断根源、彻底卸载残留到推荐黄金版本组合,提供了一套完整的实战指南,帮助网络工程师和技术学习者快速解决AR_Base等设备的启动故障,优化虚拟化环境性能。 阅读详情

相关推荐

机器学习入门指南:Jupyter Notebook实战

对于机器学习工程师而言,他们更擅长的是算法、模型、数据探索的工作,而对于工程化的能力则并不是其擅长的工作。Jupyter Notebook生成PMML文件1​​​​​​​。Jupyter Notebook生成PMML文件2​​​​​​​。PySpark Notebook建模 -折线图​​​​​​​。TensorFlowNotebook建模​​​​​​​。R Notebook建模 - 散点图​​​​​​​。PySpark Notebook建模​​​​​​​。R Notebook获取训练数据集​​​​​​​。

datacreating的博客 1974

Integer 包装类和 int 基本类型

当我们运行时,Java 会自动帮我们进行转换成函数会对传入的参数进行比较,如果在数组范围内的值会直接进行返回,不在范围内的值会新建一个对象并返回`函数会对传入的参数进行比较,如果在数组范围内的值会直接进行返回,不在范围内的值会新建一个对象并返回的最大值可以进行通过虚拟机参数进行修改,而最小值无法进行修改。

weixin_45054622的博客 403

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图)

本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。

weixin_29239279的博客 535

重学java—基础知识点

boolean/1byte/8char/16short/16int/32float/32long/64double/64每个类型都有它对应的包装类。自动装箱和拆箱操作valueOf() 方法的实现比较简单,就是,如果在的话就直接返回缓存池的内容a和b是同一个对象Integer 缓存池的大小默认为 -128~127。超过改范围之后,对象就不是同一个了..char数组被final修饰,不可变(Runtime Constant Pool)是虚拟机规范中是。

weixin_43917227的博客 455

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 260

【碳排放数据集】全球近实时网格化二氧化碳排放数据集GRACED

【碳排放数据集】全球近实时网格化二氧化碳排放数据集GRACED

WW、forever的博客 146

赶紧收藏!2024 年最常见 100 道 Java基础面试题(一)

1、JDK和JRE有什么区别? 2、==和equals的区别是什么?

weixin_42922481的博客 643

将Windbg附加到软件进程上排查异常闪退的问题

使用Windbg和Process Explorer排查因为内存泄漏导致的软件异常闪退问题。

dvlinker的技术专栏 1万+

Java并发编程实战_Java并发编程中的管程(Monitor)模型

简述 A Monitor defines a lock and zero or more condition variables for managing concurrent access to shared data.管程(Monitor)是一种和信号量(Sophomore)等价的同步机制。它在Java并发编程中也非常重要,虽然程序员没有直接接触管程,但它确实是synchronized和wai...

weixin_40003451的博客 383

02 - GRACE数据处理步骤简叙

本篇对GRACE数据处理的过程进行了介绍,简单叙述了进行数据各种改正的原因,可以帮助理解GRACE数据处理理论,本文借鉴了多篇优秀博士论文。希望可以对👪有所帮助。

weixin_43339605的博客 3346

解释多智能体强化学习(Multi-Agent Reinforcement Learning)(面试题200合集,中频、重要)

多智能体强化学习通过扩展传统强化学习框架,研究多个智能体在动态、交互环境中的策略优化问题。它既有理论上的挑战(如非平稳性和均衡求解),也有广泛的实际应用前景。数学上,它依赖马尔可夫博弈模型,核心是设计算法让智能体在合作或竞争中达到最优。

qq_38334677的博客 990

【java】【OOP】【xjtuse】面向对象程序设计 ppt翻译版

来背期末八股文啦!快来看全英ppt直翻!由于不够系统请配合下一篇一起食用。 什么是java?什么是oop?什么是JVM?java的执行模型?封装?多态?继承?运算符优先级?保留字有哪些?方法重载和方法重写有什么区别?四个访问修饰符的作用都是什么?this和super怎么用?字面量是什么?“is-a”“has-a”?字符串怎么拼接?字符串缓冲区怎么用?接口和抽象类的区别?

Genevieve_xiao的博客 1373

Coze智能体开发:搭建一个解析 PDF 文件的工作流

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 2812

java中什么是反射_Java中的反射——(1)什么是反射

Java程序中的各个Java类属于同一类事物,描写叙述这类事物的Java类名就是Class.public class ReflectTest {public static void main(String[] args) throws ClassNotFoundException {String str1 = "abc";Class cls1 = String.class;Class cls2 =...

weixin_33245735的博客 240

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

整理好了!2024年最常见 100 道 Java基础面试题(三十九)

1、Java 类初始化顺序是怎样的? 2、hashCode 有什么用?

weixin_38616368的博客 1156

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Thinking in java (RTTI And Reflection)

类型检查(RTTI与反射机制) 1、类型时类型识别(run-timetype identification,RTTI):当之有一个指向对象的引用时,RTTI可以让你找出这个对象的确切类型。 2、Java运行时识别对象和类的信息,主要有俩种方式: 1).一种是“传统“RTTI,它假定我们在运行时已经知道了所有的类型。 2).另一种是“放射“机制,它允许我们在运行时获得类的

Developer of XingKong22star 764

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

请问如何短时间突击 Java 通过面试?

我是在35+的年纪用了一年时间从银行跳槽到BAT的程序员,工作10多年来从未离开过开发一线。 你觉得自己知识储备不够,网上随便找找,都会有一堆脑图告诉你Java需要掌握哪些知识、工具和技能。比如这样的 然而这些脑图也只能给你一个大概的学习方向,你并不知道每个知识点需要掌握到什么程度,学到哪里就可以去面试了。 所以如果你想短时间内应付面试,我建议你按下面这个知识结构去准备: 为了方便理解和对标,结合你当前的情况,这里用阿里的P5-P6技术岗来说明需要掌握的知识。 P5对应校招水平,这段阶段的基础非常重要。

九章算法的博客 1586

多态&Class对象&注册工厂&反射&动态代理

类型信息(多态&Class对象&注册工厂&反射&动态代理) 运行时类型信息(RTTI)使得你可以在程序运行时发现和使用类型信息。 以下将讨论Java是如何让我们在运行时识别对象和类的信息的。 主要有两种方式: 一种是传统的RTTI:它假定了我们在编译时已经知道了所有的类型(在本程序中); 另一种是:“反射”机制,它允许我们在运行时发现和使用类的信息。 一、为什么需要RTTI 先来看一个很熟悉的例子。 abstract class Shape{ void draw(

凄戚的博客 345

JVM class 对象, 类加载器以及类的主动使用和被动使用的概述

如何判断两个 class 对象是否相同? 在 JVM 中表示两个 class 对象是否为同一个类存在两个必要条件: 类的完整类名必须一致,包括包名 加载这个类的 ClassLoader(指 ClassLoader 实例对象)必须相同 换句话说,在 JVM 中,即使这两个类对象 (class 对象) 来源同一个 Class 文件,被同一个虚拟机所加载,但只要加载它们的 ClassLoader 实例对象不同,那么这两个类对象也是不相等的 对类加载器的引用 JVM 必须知道一个类型是由启动加载器加载

qq_45560445的博客 213

string怎么一个一个读_String常量池

String常量池几乎是Java基础面试中的必问内容,这篇文章就来和大家聊一聊String常量池。来看下面的面试题目,请依次说出程序的打印结果,并说明原因。public 在回答这道题目之前,首先需要搞清楚字符串比较时的两个常用连接符,==和equals。关于==在Java中有8种基本类型,当我们使用==号来比较这8种基本类型时,它比较的是操作数的值之间的关系。比如下面的代码,a一定是等于b的,因为...

weixin_39867296的博客 236

java 类型检查_Java类型检查 学习笔记

运行期类型识别(RTTI,run-time type identification)的概念初看起来非常简单:当你只有一个指向对象的基类的引用时,RTTI 机制可以让你找出这个对象确切的类型。Java 是如何允许我们在运行期识别对象和类的信息。主要有两种方式:一种是传统的RTTI,它假定我们在编译期和运行期已经知道了所有的类型;另一种是“反射机制(reflection)”,它允许我们在运行期获得类的...

weixin_29743373的博客 299

Java枚举的一些易忽视点

所以,即使单例中的构造函数是私有的,也会被反射破坏。static类型的属性会在类加载之后被初始化,当第一个Java类第一次被真正使用时静态资源被初始化,Java类的加载和初始化过程都是线程安全的,因为虚拟机在加载枚举的类时,会使用ClassLoader的loadClass方法,而这个方法使用同步代码保证了线程安全。但是某一天A升级了,返回的枚举中多了enum3,B未升级,在反序列化的过程中使用valueOf方法在枚举类中找enum3,找不到就会抛出IllegalArgumentException异常。

qq_32473523的博客 700

深入JVM 类加载器

类加载阶段的通过一个类的全限定名获取该类的二进制字节流这个动作可以人为的放到虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为 类加载器 类加载器是Java语言的创新特性,也是其流行的原因,类加载器在类层次划分,热部署,代码加密等领域大放异彩,成为Java技术体系的一个重要组成部分 类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用远不止类加...

一只老风铃 386

Java基础面试汇总

概述 ★★★★★"=="和equals方法有什么区别? == 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型比较的是值,引用数据类型比较的是内存地址) equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况: 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象...

赛博夫子 1010

类型信息

概要   本文主要讨论Java是如何让我们再运行时识别对象和类的信息的。这主要采取两种形式:一种是“传统”RTTI (Run-Time Type Identification:在运行时识别一个对象的类型),它假定我们已在编译时已经知道了所有的类型;另一种是“反射”机制,利用它可在运行期独立查找类信息。 1.Class对象   要理解RTTI 在Java 里如何工作,首先必须了解类型信息在运行...

naonao2014的专栏 582

thinking in java学习记录(十四)类型信息

14.1 为什么需要RTTI 14.2 Class对象 14.2.1 类字面常量 14.2.2 泛化的Class引用 14.2.3 新的转型语法 14.3 类型转换前先做检查 14.3.1 使用类字面常量 14.3.2 动态的instanceof 14.3.3 递归计数 14.4 注册工厂 14.5 instanceof与Class的等价性 反射:运行时的类信息 ...

c630843901的博客 174
上一篇: C++重新学习心得(1)(《C++Primer第四版》1-8章)
下一篇: 《数据结构》复习之线性表(顺序表和链表)
King来写代码
博客等级 码龄12年 68粉丝 30原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值