包装类Integer的equal方法与“==”运算符 比较

包装类Integer的equal方法与”==”运算符 比较

一、在讲述之前先扔出一段代码看看

 public static void main(String[] args)  {
        Integer num1=15;
        Integer num2=15;
        boolean equals = num1.equals(num2);
        boolean b = num1 == num2;
        System.out.println("使用equal方法"+equals);
        System.out.println("使用==运算符"+b);

        Integer num3=128;
        Integer num4=128;
         equals = num3.equals(num4);
         b = num3 == num4;
        System.out.println("使用equal方法"+equals);
        System.out.println("使用==运算符"+b);

        Integer num5=128;
        int num6=new Integer(128);
        equals = num5.equals(num6);
        b = num5 == num6;
        System.out.println("使用equal方法"+equals);
        System.out.println("使用==运算符"+b);
    }

运行结果

包装类Integer的equal方法与“==”运算符 比较

小朋友看了这个结果有没有什么疑问?

二、反编译代码

包装类Integer的equal方法与“==”运算符 比较

我相信看到这个反编译代码后,就可以懂了个大概
所谓的自动拆箱,自动装箱。就是在编译产生字节码时候编译器为我们添加Integer.valueOf()和intValue()方法

三、先说equal方法

查看Integer源码中equal方法,发现它重写了equal方法,代码如下

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

看到源码是否瞬间就理解为什么equal全为true? equal实际底层比较的就是两个int型数字,因为二者数字都是相同的,所有equal一直是true。若一个为2一个为3,那么equal方法所得到的就是false咯!

四、再来说说”==”运算符

1.对于第一个

Integer num1=15;
      Integer num2=15;
      boolean equals = num1.equals(num2);
      boolean b = num1 == num2;
      System.out.println("使用==运算符"+b);

为什么””运算符的结果为true呢?””运算符所比较的是二者地址,结果应该为false啊
答:该运算符确实比较的是地址,但结果确实应该是true,我们来看一下源码
根据反编译结果可知:自动装箱调用的是valueOf方法,那我们看一下valueof源码
该方法用到了IntegerCache类,我把该类的源码也放上

包装类Integer的equal方法与“==”运算符 比较
根据源码可知,类加载时就把从-128~127的数创建好Integer对象存入cache中,需要的时候直接到cache中去取,所以每次取得的对象同时同一个,所以结果为true也就不足为奇

2.再看第二个比较

Integer num3=128;
        Integer num4=128;
         equals = num3.equals(num4);
         b = num3 == num4;
        System.out.println("使用==运算符"+b);

理解了第一个比较,这个就很好理解了,因为128超过了给定的-128-127范围,所以要new Integer,产生两个对象,所以结果为false

3.最后看第三个比较

 Integer num5=128;
        int num6=new Integer(128);
        equals = num5.equals(num6);
        b = num5 == num6;
        System.out.println("使用==运算符"+b);

从反编译结果可以看出,在比较时num6调用了intvalue方法得到int型数,所以128==128结果当然是true

Original: https://www.cnblogs.com/threeAgePie/p/15766211.html
Author: 三只蛋黄派
Title: 包装类Integer的equal方法与“==”运算符 比较

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573324/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 创建vue项目

    使用命令行创建vue项目时候要以管理员身份运行,否则可能会报错 安装element插件 在idea中导入vue项目,使用终端npm run serve 来运行vue项目 Origi…

    Java 2023年6月7日
    058
  • CentOS7迷你版安装部署hadoop高可用无法自动切换角色解决办法!

    用 kill -9 进程号 杀死了当前处于active状态的NameNode后,其他的 Standby 状态的NameNode 并没有自动切换为 Active状态,而且重启杀死的 …

    Java 2023年6月9日
    072
  • RenderX java的xml打印

    http://www.zdnet.com.cn/techupdate/apply/collaboration/story/0,3800030473,39347913,00.htm …

    Java 2023年5月29日
    088
  • VMware及win10虚拟机的安装及环境配置

    一、安装VMware 1.1、下载VMware安装包 在此给大家一个迅雷的链接:点击下载提取码:sp84 1.2、点击下一步 1.3、点击我接受,点击下一步 1.4、更换安装位置,…

    Java 2023年6月5日
    072
  • Mybatis的缓存

    Mybatis的一级缓存是 默认开启的,你只要搭建一个Mybatis框架,就可以直接使用一级缓存。 一级缓存是 SqlSession级别的,通过SqlSession查询的数据会被缓…

    Java 2023年6月14日
    085
  • 15分钟学会JWT使用

    什么是JWT? JSON Web Token ,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。 jwt 可以生成 一个加密的token,做为用户登录…

    Java 2023年6月9日
    066
  • Google搜索为什么不能无限分页?

    这是一个很有意思却很少有人注意的问题。 当我用Google搜索 MySQL这个关键词的时候,Google只提供了 13页的搜索结果,我通过修改url的分页参数试图搜索第 14页数据…

    Java 2023年6月7日
    073
  • 使用Visual Studio Code开发和调试Java Burp扩展

    几天前,我发布了Bug Diaries Burp扩展。这是一个Burp扩展程序,使社区(免费)版 Burp 拥有相似的issue功能 。由于某些原因,现在决定用Java重写。这是我…

    Java 2023年5月29日
    081
  • 一个理科直男如何看《鱿鱼游戏》

    前言 我一向不怎么喜欢看棒子片。 但是十一期间却疯狂的追着一部剧:《鱿鱼游戏》。 这片子在全网实在是太火了,火到全球播放量1.11亿次,成为奈飞收视率最高的全球非英语原创剧。 鱿鱼…

    Java 2023年6月8日
    078
  • springboot整合ehcache

    springboot整合ehcache 工具类实现缓存 1. jar包导入 <dependency>   <groupId>org.springf…

    Java 2023年6月9日
    059
  • springBoot 获取注解参数的原理

    判断每个参数带有注解是哪个,是否存在相应的解析器 寻找合适的处理适配器 DispatcherServlet中的 doDispatch方法 // Determine handler …

    Java 2023年6月16日
    066
  • win10搭建mysql主从复制(单台机器)

    找了好多文章,都是多台机器,而且写的博客实在看不下去,无奈。环境: mysql5.5win10主机和从机都是在win10下面的一个目录下。另外:如果是从没有安装过mysql的可以直…

    Java 2023年6月7日
    069
  • 网络与信息安全基础知识考点——软件设计师

    考纲要求掌握 前言 计算机网络的分类 网络拓扑结构 1 OSI/RM七层模型 层次 名称 主要功能 主要设备 7 应用层 实现具体的应用功能 类型QQ 6 表示层 设备将固有的数据…

    Java 2023年6月6日
    055
  • 记一次排查线上MySQL死锁过程,不能只会curd,还要知道加锁原理

    昨晚我正在床上睡得着着的,突然来了一条短信。 啥,线上MySQL死锁了,我赶紧登录线上系统,查看业务日志。 能清楚看到是这条insert语句发生了死锁。 MySQL如果检测到两个事…

    Java 2023年6月8日
    080
  • 聊天软件的后端架构NIO

    聊天软件等的技术,朋友圈,钉钉,微博分两种技术模式:1.读扩散:也就是拉模式消息会存储到自己的发件箱里面,然后让每个上线的人去拉取未读消息,缺点是每次都要去好多底线去拉取数据,读操…

    Java 2023年6月14日
    059
  • Java中的三种校验注解的使用(@Valid,@Validated和@PathVariable)

    @RestController public class PathErrorController extends BasicErrorController {@Autowiredp…

    Java 2023年5月29日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球