包装类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.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类,我把该类的源码也放上



根据源码可知,类加载时就把从-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

包装类Integer的equal方法与“==”运算符 比较的更多相关文章

  1. 重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源

    今天这篇文章我们打算来深度解读一下equal方法以及其关联方法hashCode(),我们准备从以下几点入手分析: 1.equals()的所属以及内部原理(即Object中equals方法的实现原理) ...

  2. java中equal方法总结

    场景:本周在完成一个公司业务功能时,在判断是否为代叫单时调用了equal方法: PublishOrderType.HELP_ORDER.equals(valetOrderExtraInfoDO.get ...

  3. hashCode()方法和equal()方法的区别

    本文参考地址:http://www.cnblogs.com/zgq0/p/9000801.html hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等 ...

  4. String中的“equal方法”和“==”

    二话不说,先来说下重写的事情: 在Java中,String .Math.还有Integer.Double....等这些封装类重写了Object中的equals()方法,让它不再比较其对象在内存中的地址 ...

  5. java——包装类中的equals方法

    基本数据类型包装类中的equals方法用于比对相同包装类中的值是否相等,如果两者比较的包装类类型不同则返回false: Byte public boolean equals(Object obj) { ...

  6. String和包装类Integer\Double\Long\Float\Character 都是final类型

    String和包装类Integer\Double\Long\Float\Character\Boolean 都是final类型 不可以改变

  7. java——HashCode和equal方法

    equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...

  8. java hashcode()和equal()方法比较

    通常equals,toString,hashCode,在应用中都会被复写,建立具体对象的特有的内容. 之所以有hashCode方法,是因为在批量的对象比较中,hashCode要比equals来得快,很 ...

  9. HashCode和equal方法

    equals()反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. 而hashCode()是对象或变量通过哈希算法计算出的哈希值. 之所以有hashCode方 ...

  10. pojo类对应的就是数据库中的表,pojo类属性类型一定要用包装类Integer等

    pojo类对应的就是数据库中的表,pojo类属性类型一定要用包装类Integer等 pojo类对应的就是数据库中的表,pojo类属性类型一定要用包装类Integer等 pojo类对应的就是数据库中的表 ...

随机推荐

  1. React-Native开发鸿蒙NEXT-图片上传

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. [Java/模板渲染引擎/技术选型] 模板引擎-技术调研

    概述: 模板渲染引擎 := 模板引擎 为什么要使用[模板(渲染)引擎]?模板(渲染)引擎的作用? 模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,大大提升了开发效率,良好的设计 ...

  3. 第1.2讲、从 RNN 到 LSTM 再到 Self-Attention:深度学习中序列建模的演进之路

    处理序列数据(如文本.语音.时间序列)一直是深度学习的重要课题.在这个领域中,我们从 RNN(Recurrent Neural Network)出发,经历了 LSTM(Long Short-Term ...

  4. Spring Boot MyBatis使用type-aliases-package自定义类别名

    摘要:介绍MyBatis 中 type-aliases-package 属性的作用.在Spring Boot项目中,使用属性type-aliases-package为MyBatis引用的实体类自定义别 ...

  5. Mysql索引为什么要采用B+Tree而非B-Tree

       B+树非叶子节点不存储数据只存储索引,B树非叶子节点存储数据.    B+树查询效率更高.B+树使用双向链表串连所有叶子节点,区间查询效率更高(因为所有数据都在B+树的叶子节点,扫描数据库 只需 ...

  6. Ubuntu 通过 docker 运行 redis

    1.首先拉取redis的镜像 docker pull redis 2.运行redis容器 docker run --name redis -p 6379:6379 -d redis --name re ...

  7. springboot在拦截器里注入mapper失败Null问题

    问题 直接在拦截器里这样注入mapper(dao)会导致null 解决方案 修改拦截器配置 原来的配置 修改为如下

  8. 2023人形全能赛竞速机器人mega代码

    mega // @Author : Hcm #include <LobotServoController.h> // 舵机板通信 #include <OneButton.h> ...

  9. Kubernetes中的多租户

    多租户 多租户集群由多个用户和/或工作负载共享,这些用户和/或工作负载被称为"租户".多租户集群的运营方必须将租户彼此隔离,以最大限度地减少被盗用的租户或恶意租户可能对集群和其他租 ...

  10. js加密手机号码中间四位方法

    一.实现效果: 二.方法代码封装: 方法一: //encryptPhoneNumber.ts /** * 加密手机号码中间四位 * @param phone 手机号 * @returns { stri ...