Integer类自动拆箱,装箱解析
1.自动拆箱
例1:
int i1 = 10;
Integer i2 = new Integer(10);
System.out.println(i1 == i2);
这个结果是true
i1为基本数据类型值为10,i2为Integer类对象value属性值为10,在进行比较运算时,i2会自动拆箱成int类型然后再与i1进行比较所以结果是true。
所以我们来看一下自动拆箱里面发生了什么,其实非常简单,

在执行i1 == i2时由于i2是包装类和基本数据类型进行比较所以要进行拆箱,通过反编译我们在code:18可以看到他执行了intValue这个函数将i2转化成了int类型进行比较所以结果是true。
2.自动装箱
例2:
Integer i1 = 126;
Integer i2 = Integer.valueOf(126);
Integer i3 = 128;
Integer i4 = Integer.valueOf(128);
System.out.println(i1 == i2);
System.out.println(i3 == i4);
乍一看这两个乍一看无论对错结果应该一样吧,因为都是相同的结构,但是答案是第一个是true,第二个是false。
为什么是这样呢?首先这段代码的第一行会进行自动装箱,自动装箱会调用Integer.valueOf()。来看一下这段代码的反编译结果。

根据反编译结果我们明显可以看出自动装箱本质上调用了valueOf这个函数,那为什么上下结果不一样呢。我们来追一下它的源码。

根据源码可以看出Integer类中存在一个缓存机制,当调用valueOf函数时,如果参数i的范围在[-128,127]区间时,它会从IntegerCache中取出已有的Integer对象返回,如果超过这个范围则会重新创建一个Integer的对象。所以我们再来看一下IntegerCache类中如何给cache数组赋值的。

根据之前所说最大值可以通过启动JVM时使用系统属性来更改缓存的最大值,所以当我更改时看看会有什么不同的效果。

看下一个例子:
public static void main(String[] args) {
Integer i1 = 126;
Integer i2 = Integer.valueOf(126);
Integer i3 = 128;
Integer i4 = Integer.valueOf(128);
Integer i5 = 250;
Integer i6 = Integer.valueOf(250);
System.out.println(i1 == i2);
System.out.println(i3 == i4);
System.out.println(i5 == i6);
}

因为我已经更改了IntegerCache的high值为200不再是之前的127所以在[-128,200]之间的数我们可以直接通过cache数组拿到Integer实例,不需要重新创造。所以126和128都是true,250不在这个区间范围之内所以它需要重新创造Integer类的实例所以返回false。下次我们再遇到类似问题就可以迎刃而解了。
Integer类自动拆箱,装箱解析的更多相关文章
- int和Integer的自动拆箱/装箱相关问题
java中为没一种基本类型都提供相应的包装类型. byte,short,char,int,long,float,double和boolean Byte,Short,Character,Integer, ...
- Java 从Character和char的区别来学习自动拆箱装箱
本文结构 1.Character和char 的区别: 2.自动拆箱装箱 1.Character和char 的区别: Character是类,char基本数据类型. 在java中有三个类负责对字符的操作 ...
- java Integer类以及拆箱和装箱
package com.ilaw.boson.controller; public class Demo { public static void main(String[] args) { Inte ...
- Java中的自动拆箱装箱(Autoboxing&Unboxing)
一.基本类型打包器 1.基本类型:long.int.double.float.boolean 2.类类型:Long.Integer.Double.Float.Boolean 区别:基本类型效率更高,类 ...
- JavaWeb_静态导入、自动拆箱/装箱
静态导入用于简化程序对类静态属性和方法的调用. 语法 import static 包名.类名.静态属性|静态方法|* 例如 import static java.lang.System.out imp ...
- JAVA高级特性--自动拆箱-装箱,枚举类型
基本数据类型转换为引用类型对象 一个自动装箱的例子 Integer i=10; 相当于 Integer i=new Integer(10); 一个自动拆箱的例子 Integer m=10; int n ...
- 关于Java自动拆箱装箱中的缓存问题
package cn.zhang.test; /** * 测试自动装箱拆箱 * 自动装箱:基本类型自动转为包装类对象 * 自动拆箱:包装类对象自动转化为基本数据类型 * * * /*缓存问题*/ /* ...
- Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析
都0202 了 java 1.8 已经是主流 自动装箱 .拆箱已经很普遍使用了,那么有时候是不是会遇到坑呢? 我们先来看一段代码: public class TestWraperClass { pub ...
- Integer的自动拆箱
public class Test2{ public static void main(String[] args){ Integer a=1; Integer b=2; Integer c=3; I ...
- Integer封装与拆箱
Integer封装与拆箱 简介: 目录: Integer自动封装的陷阱 Integer自动拆箱机制 Integer自动封装的陷阱 public class IntegerDemo { public s ...
随机推荐
- Java 日期类 处理
原始方案:SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD"); //线程不安全类,最好不要用了,替代方案: Date ...
- nginx auth_basic uwsgi 目录简易认证。
mkdir /etc/nginx/conf.d/auth_pwd touch /etc/nginx/conf.d/auth_pwd/xx.pwd htpasswd -c -d /etc/nginx/c ...
- 【快速学】C/C++编译器
编译器 谁维护 平台 版权 Visual C++ Microsoft https://visualstudio.microsoft.com/ Microsoft Windows 有免费版 GCC C ...
- EF Core如何到回滚上一次迁移
update-database 上上次迁移记录 让数据库回滚 remove-migration 删除本次有误的迁移文件 修改完毕后 add-migration updata-database 完成
- SecurityRandom随机数生成
package com.netauth.utils; import java.security.SecureRandom; /** * * <p> * SecureRandom随机数生成工 ...
- 访问远程服务-RPC 与 REST
方法调用 所做的传递参数.传回结果都依赖于栈内存.所以Caller 调用者 Callee 被调用者应该同属一个进程,拥有相同的 栈内存, 进程间通信(Inter-Process Communicati ...
- JS实现另存/打印功能
代码实现 <div id="main"> <-- 需要保存的内容 --></div> <div @click="printdiv ...
- git版本回退:git reset --hard 版本号
开发项目中会遇到各种奇葩的事情: 奇葩系列之在项目更新迭代开发正带劲的时候突然更新项目之前的项目出问题了要修复.在开发功能一半又要修复之前的问题着急上线的情况下.此时此刻git的版本回退是那么的迷人, ...
- jadx 定位方法
目录 链接参数定位 链接参数定位 通过搜索请求链接中的参数来定位函数位置,如下图所示,请求链接为 https://www.python-spider.com/api/app1,app1为链接标识,可以 ...
- PostScript语言教程(五、文本打印)
5.1.POSTSCRIPT字体 字体是具有统一规格的字符集.其中包含数百个字符集,包含熟悉的TIMES和HELVETICA 使用POSTSCRIPT字体 在你打印文本之前,你需要指定所需的字体,这个 ...