Integer直接赋值使用==判断是否相等

//java中如果Integer不是new出Integer对象,而是直接赋值如Integer a=100;Integer b=100;System.out.println(a==b);  //trueInteger c=150; Integer d=150;System.out.println(c==d); //false

那么这里为什么会第一个打印true第二个打印false呢?
出现这样结果的原因要从Integer的自动装箱和拆箱来说起。

//Integer类会自动将int类型装箱为Integer
Integer i = 100;
//这行代码Integer会自动拆箱为int
int n = i;

装箱和拆箱成为了Java自身做的工作,将方法的调用隐藏了起来,其实装箱和拆箱的过程分别调用了Integer的valueOf()和intValue()方法,首先来看valueOf方法的源码。

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}

从源码可以看出,Integer的装箱用到了 IntegerCache,这里我们还看不出什么,我们点进 IntegerCache看看

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

可以看出其中的low的值是-128,high的值是127,而cache数组存储了从low至high递增的Integer。而当valueOf方法中,当传入的参数也就是装箱的int在low至high的范围内时,Integer会从cache数组中取出相应的缓存Integer对象返回。

回到最上面的问题,为什么第二个要打印false?

Integer c=150; Integer d=150;System.out.println(c==d); //false

这两行代码的150不在low至high之间,此时c和d都是新new的Integer对象,是两个对象,所以使用==是不能判断两个的值是否相等的

接下来我们就看一看拆箱
我们先看一下源码

/*** Returns the value of this {@code Integer} as an* {@code int}.*/public int intValue() {return value;}

这里就是直接返回的value值,这个就没什么说的了

总结
Integer的装箱会根据要装箱的int值大小选择从Integer的缓存中取出Integer对象或者新创建一个Integer对象返回,而Integer的自动拆箱会返回被装箱的int值,因为Integer的equals被重写过,建议Integer对象进行相等比较时使用equals方法。

本文参考
作者:Cloneable
链接:https://www.jianshu.com/p/2e4490738087

Integer自动装箱和拆箱,以及不使用不使用new关键字直接赋值会遇到的的问题相关推荐

  1. java中的拆箱和装箱是指什么_一文带你理解Java中自动装箱和拆箱

    Java中自动装箱和拆箱 装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用. 这里的 ...

  2. 一文带你理解Java中自动装箱和拆箱

    Java中自动装箱和拆箱 装箱(Boxing),也称为包装(Wrapper),是在对象中放置原语类型(primitive type)的过程,以便原语(primitive)可以作为引用对象使用. 这里的 ...

  3. 由自动装箱和拆箱引发我看Integer源码

    背景和问题 在看别人整理的资料时,看到如下一段代码: package com.sitech.test;/** * 自动装箱和拆箱 jdk1.6 * @author liaowp * */public ...

  4. Java13-day04【Integer、int和String的相转、自动装箱和拆箱、Date、SimpleDateFormat、Calendar、异常、try...catch、throws】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  5. Java中的自动装箱和拆箱

    自动装箱和拆箱 自动装箱和拆箱 自动装箱: 拆箱 1. 为什么要有包装类(或封装类) 2. 基本数据类型与对应的包装类: 3. 类型间的转换 4. 何时发生自动装箱和拆箱 赋值.数值运算时 方法调用时 ...

  6. java可以用 lt =判断int吗_int 和 integer:装箱和拆箱的过程,会用到什么方法

    本文转载自[微信公众号:五角钱的程序员,ID:xianglin965],经微信公众号授权转载,如需转载与原文作者联系 原文标题<int 和 integer :装箱和拆箱的过程,会用到什么方法,你 ...

  7. Java的知识点20——包装类基本知识、包装类的用途、自动装箱和拆箱、包装类的缓存问题

    包装类基本知识 将基本数据类型存储到Object[]数组或集合中的操作 包装类均位于java.lang包 "数字型"都是java.lang.Number的子类.Number类是抽象 ...

  8. Java自动拆装箱面试_跟王老师学泛型(二):Java自动装箱与拆箱

    Java 自动装箱与拆箱(Autoboxing and unboxing) 主讲教师:王少华 QQ群:483773664 学习目标: 掌握Java 基本数据对应的包装类 掌握Java 自动装箱与拆箱 ...

  9. java-Integer的自动装箱与拆箱

    package com.day9.Wrapclass; public class Demo4Integer { /** * A:案例演示 * JDK5的新特性自动装箱和拆箱 * Integer ii ...

最新文章

  1. 手把手教你搭建 ELK 实时日志分析平台
  2. (How to)WordPress与Windows Live Writer整合
  3. rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞
  4. .net swf 上传组件
  5. 单片机c语言模块化实例程序设计,单片机C语言模块化设计
  6. 深入理解K8S网络原理下
  7. 堆积柱形图显示总数_送你一份堆积柱形图小点心,请收下~
  8. Kerberos安装
  9. python培训班靠谱吗-quot;quot;经常看到的python培训机构排名靠谱嘛?应该如何选择培训机构?...
  10. scala zip--拉链操作入门
  11. 3137102432_施少兵_实验2
  12. MRI图像处理:VBM原理和步骤
  13. 纯代码给wordpress增加说说/微博/微语功能
  14. 国内App推广N种方法,总有几种适合你
  15. 使用keycloak自定义SPI接入外部用户登录
  16. 实践数据湖iceberg 第十一课 测试分区表完整流程(造数、建表、合并、删快照)
  17. 能用CSS实现的就不用麻烦JavaScript(Part2)
  18. 【数据库】ER图进行描述某系统之学习七
  19. INPUT输入框带默认值
  20. apple pay集成_如何将Google Pay集成到您现有的Android应用中

热门文章

  1. cocos creator spine动画控制停止在中间的某一帧
  2. 全球商品期货量化交易策略
  3. 使用脑机接口从神经信号中重建单词
  4. android运行ios应用程序,Win10手机真能运行Android/iOS程序?如何实现?
  5. 离散数学(5)——有序对、卡氏积、二元关系、定义域,值域,域、逆,合成(复合)、限制、象、单根、单值
  6. 两级式三相光伏并网simulink仿真(LC滤波,电导增量)详细教学
  7. 智能外呼系统、rgb摄像头
  8. 学习无霍尔传感器的BLDC方波调速
  9. 把自己拆解成颗粒,然后见到vivo
  10. java-php-python-ssm计算机类在线学习管理系统计算机毕业设计