文章目录

  • 前言
  • equals方法:
  • “==”比较
  • IntegerCache 缓存
  • 举例
  • 总结

前言

以Interger为例说明自动装箱的陷阱,最好先看一下总结再开始看

equals方法:

Interger的equals底层源码:

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

在equals(Object obj)方法中,先判断参数中的对象obj是否是Integer同类型的对象,如果是则判断值是否相同,值相同则返回true,值不同则返回false;如果obj不是Integer类的对象,则返回false。
⭐需要注意的是:当参数是基本类型int时,编译器会给int自动装箱成Integer类,然后再进行比较。

  1. 基本类型(值类型)之间无法使用equals比较。
  2. equals参数为值类型,则参数会进行自动装箱为包装类型,之后请参见第3点。
  3. equals参数为包装类型,则先比较是否为同类型,非同类型直接返回false,同类型再比较值。

示例:

  • new Long(0).equals(0) 为false,equals参数默认为int类型,装箱为Integer类型,不同类型直接返回false
  • new Integer(500).equals(500) 为true,equals参数默认为int类型,装箱为Integer类型,相同类型再比较值返回true
  • new Integer(500).equals((short)500) 为false,equals参数为byte类型,装箱为Byte类型,不同类型直接返回false
  • new Long(0).equals(0L)为 true,equals参数为long类型,装箱为Long类型,相同类型再比较值返回true

“==”比较

“==”比较

  1. 基本类型之间互相比较:以值进行比较
  2. 一边是基本类型,一边是包装类型
    a) 同类型的进行比较,如Integer 与int,Long与long进行==比较时,会自动拆箱比较值
    b) 不同类型之间进行比较,则会自动拆箱,且会进行自动向上转型再比较值(低级向高级是隐式类型转换如:byte<short<int<long<float<double,高级向低级必须强制类型转换)
  3. 两边都是包装类型则直接比较引用地址,但是要注意IntegerCache除外。

IntegerCache 缓存

JAVA的Integer有IntegerCache会缓存-128~127之间的对象。
如:Integer x = 100,会调用Integer的valueOf()方法,这个方法就是返回一个Integer对象,但是在返回前,作了一个判断,判断要赋给对象的值是否在[-128,127]区间中,且IntegerCache(是Integer类的内部类,里面有一个Integer对象数组,用于存放已经存在的且范围在[-128,127]中的对象)中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新对象返回。

Integer i02 = 59;
Integer i03 = Integer.valueOf(59);
Integer i04 = new Integer(59);System.out.println(i02 == i03);  //true 因为59位于缓存区间直接从缓存中获取
System.out.println(i02 == i04);  //false
System.out.println(i03 == i04);  //false
Integer i02 = 200;
Integer i03 = Integer.valueOf(200);
Integer i04 = new Integer(200);System.out.println(i02 == i03);  //false 因为200超出缓存区间从新创建对象
System.out.println(i02 == i04);  //false
System.out.println(i03 == i04);  //false

举例

以下代码来自《深入理解Java虚拟机》P376、P377:

    public static void main(String[] args) {Integer a = 1;Integer b = 2;Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;Long g = 3L;//左右都是Integer比较值,同时考察IntegerCache缓存System.out.println(c == d); //T ,在cacheSystem.out.println(e == f); //F,不在cache//先进行 a+b 自动拆箱后变成了值System.out.println(c == (a + b));  //T,有一边有值,都变成值再比较,且在cacheSystem.out.println(c.equals(a + b)); //T,a+b 会自动装箱成Integer,再进行比较System.out.println(g == (a + b));  //T,有一边有值,都变成值再比较,且在cacheSystem.out.println(g.equals(a + b));  //F,a+b自动装箱转成Integer,类型不同直接返回false}

总结

  • equal:括号里传入的参数为值(比如int、short等),则自动装箱(int变成Integer,short变成Short),先比较类型,不相同直接false,相同在比较值,不会向上或向下转型;
  • ==:有其中一边有值(比如int、short等)就两边都自动拆箱、自动向上转型再比较值,如果两边都是包装类(即引用类型,如Integer)就比较地址,但要注意cache。
  • 区分:equal不会自动向上转型

参考博客:JAVA中Integer的==和equals注意

自动装箱和自动拆箱的陷阱相关推荐

  1. Java 进阶——自动装箱和自动拆箱

    1.什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a ...

  2. Java自动装箱与拆箱及其陷阱

    2019独角兽企业重金招聘Python工程师标准>>> 在本文中,笔者向大家介绍下Java中一个非常重要也非常有趣的特性,就是自动装箱与拆箱,并从源码中解读自动装箱与拆箱的原理,同时 ...

  3. java中的自动装箱和自动拆箱

    Java为每种基本类型提供了对应的包装器类型,那么包装器类型在Java中扮演和起到什么的角色,这样从Java这个面向对象的语言特性来说了.因为容器中加入的都是类的对象而不是基本数据类型.故需要先将基本 ...

  4. java 自动装箱自动拆箱_自动装箱和自动拆箱

    自动装箱和自动拆箱 Java 提供了 8 种基本数据类型,每种数据类型都有其对应的包装类型,包装类是面向对象的类,是一种高级的数据类型,可以进行一些比较复杂的操作,它们是引用类型而不再基本类型了. 基 ...

  5. 自动装箱与自动拆箱的一些问题

    今天打算复习一下Java基础,之前学的太快速了,现在暑假,好好把那些细节看一下 复习到自动装箱和自动拆箱的时候,这里有个很有趣的现象 Integer n1 = 100; Integer n2 = 10 ...

  6. 第三次学JAVA再学不好就吃翔(part64)--自动装箱和自动拆箱

    学习笔记,仅供参考 自动装箱和自动拆箱 装箱:把基本类型转换为包装类类型 int x = 100; Integer i1 = new Integer(x); 拆箱:把包装类类型转换为基本类型 int ...

  7. java 自动装箱自动拆箱,java自动装箱、自动拆箱和正常情况性能比较

    自动装箱和自动拆箱是java5.0版本引入的,能自动将基本类型转换为对应的基本类型包装对象,那么我们比较一下他们的性能情况. package com.wmmad.test; import junit. ...

  8. 包装类,包装类的自动装箱和自动拆箱

    目标 1)包装类的作用, 2)掌握包装类的自动装箱和自动拆箱操作. 3)掌握包装类的转换操作. 具体内容 一切皆对象,八种基本数据类型不是对象. 把Int包装成一个类,这样的一个类就可以以对象的形式操 ...

  9. 深入理解自动装箱和自动拆箱

    一.什么是自动装箱.自动拆箱 此机制开始于jdk 1.5 java中有8种基本类型,对应8种基本类型有8个包装类. 整形 实型 布尔型 字符型 long/int/short/byte float/do ...

  10. 装箱和拆箱,自动装箱和自动拆箱

    装箱和拆箱,自动装箱和自动拆箱 以Integer的创建为例. 装箱和拆箱 装箱:把基本数据类型转换成包装类对象(int->Integer) Integer num1=new Integer(17 ...

最新文章

  1. 【SSM 4】Mybatis逆向生成工具
  2. 【S操作】简单粗暴自动化免费文档存储备份方案
  3. FPGA篇(十二)仿真中 `timesclae的用法
  4. 【Tiny4412】制作最小文件系统脚本
  5. java quot;1quot;==quot;1quot;_JAVA: 为什么要使用quot;抽象类quot;? 使用quot;抽象类quot;有什么好处?...
  6. 如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优
  7. webpack devserver配置_在webpack中使用babel
  8. Ambari架构源码解析
  9. C++socket编程(六):6.3 并发测试工具ab的使用(apache工具)
  10. pythonexcel模块哪个好_Python-Excel 模块哪家强?
  11. 怎么恢复服务器上刚刚删除的文件,怎样恢复刚刚删除的文件 详细教程分享【图解】...
  12. ⅴs2010控件名称及用方法_VS2010 用户自定义工具箱控件的制作方法
  13. 绕过AppLocker系列之Rundll32的利用
  14. 想从事Python后端开发?如何入门和学习,这篇文章来告诉你。
  15. Sequencer框架
  16. 下载c语言软件后怎么解压,手机怎么解压文件 盘点常用手机压缩打包解压文件应用...
  17. 2021年HECTF部分Writeup
  18. 天龙八部 - 其它 - 手工选择
  19. 猿创征文|Google Earth Engine(GEE)实现土地利用数据栅格转矢量
  20. 【MOT】C-BIoU:Hard to Track Objects with Irregular Motions and Similar Appearances?

热门文章

  1. 一个毕业6年的程序员工作经历和成长感悟(中)
  2. java实现第七届蓝桥杯平方末尾
  3. 联邦学习与安全多方计算
  4. 奇异谱分解轴承故障诊断代码编写
  5. 计算机考试网站配置参数错误,电脑一直显示数据配置错误怎么办
  6. 记一次失败的夏令营面试
  7. 【论文】论文整体结构(以项目干系人管理为例)
  8. java 利用网页显示摄像头_web网页调用摄像头拍照
  9. 【virtualbox】虚拟机virtualbox mac版使用教程
  10. AC/DC 反激 (Flyback) 控制器