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 ...
随机推荐
- jubyter notebook 安装conda 虚拟环境
- Java实现输出三角形
本来是想实现空心的,想了太久没写出来就算了 代码 package com.qaq.strruct;public class TestDemo01 { //打印三角形 //思路:空格的距离和星星的数量成 ...
- 【笔记】DDD实战课-人保架构欧创新
目录 开篇 学好DDD,你能做什么? 基础 领域驱动设计:微服务设计为什么要选择 DDD? DDD的两层设计 DDD与微服务的关系 领域.子域.核心域.通用域和支撑域:傻傻分不清? 领域和子域 核心域 ...
- SqlServer查看索引信息
sp_helpindex tablename
- 使用chrome自带的实时字幕功能
https://www.youtube.com/watch?v=upm9qCMT96Q
- Django 之 ORM1
1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...
- Jmeter 5.0 遇见connection reset问题
问题:大并发时遇见java.net.SocketException: Connection reset 测试过程中经常遇见connection reset ,原因是大数据量发送时,服务器不能接纳那么多 ...
- 【Java】List
对List中map集合中某个字段排序 升序排列 方法1 Collections.sort(maps, new Comparator<Map<String, Object>>() ...
- IDEA配置新学
文件太大导致IDEA不把该文件当成Java类看待 解决方式: 打开本地IDEA的bin目录,找到idea.properties文件,进入进行设置: idea.max.intellisense.file ...
- vi/vim 命令
vim 文件路径 编辑一个文件,英文模式, 按i:输入模式 按Esc:命令模式 输入模式 dd 删除一行 gg 跳到开头 shift+g 跳到结尾 U 撤销 shift+U 恢复撤销 命令模式 :wq ...