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 ...
随机推荐
- /usr/bin/install: cannot create regular file `/usr/local/jpeg6/include/jconfig.h'
出现下列异常: /usr/bin/install -c -m 644 jconfig.h /usr/local/jpeg6/include/jconfig.h /usr/bin/install: ca ...
- DIV CSS遮罩层(弹窗窗口)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python监控文件变化
网址: https://blog.csdn.net/qq_40223983/article/details/102889329 起步在python中文件监控主要有两个库,一个是pyinotify,一个 ...
- 整数中出现1的次数(从1到n整数中1出现的次数)
offer_31 概要:整数中出现1的次数(从1到n整数中1出现的次数) 题目描述 求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有 ...
- unity创建一个数组,让他随机生成一个东西之C#语言(有图教程)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...
- Linux环境使用Docker安装MongoDb
系统环境: CentOS 7.6 64位(同样适用于Ubuntu) 安装步骤: 1.创建文件夹 /home/docker/mongo/config /home/docker/mongo/data 2. ...
- SSH 秘钥登入
1.打开权限 vim /etc/ssh/sshd_config 去掉 PubkeyAuthentication yes 一行的# 2.重启ssh服务 systemctl restart ss ...
- 循环3-while语法
一.介绍和语法 1. while循环方式 while循环语句会对紧跟在while命令后的条件表达式进行判断,如果该表达式成立,则执行while循环里面的命令或语句,每一次执行到done时,会重新判断w ...
- Gif多图:我常用的 16 个 Sublime Text 快捷键 - 文章 - 伯乐在线
Gif多图:我常用的 16 个 Sublime Text 快捷键 2014/12/23 · 书籍与教程, 开发 · 4 评论· Sublime Text 分享到: 139 .imooc, .imooc ...
- Java-token生成
1. 引入jar包 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt< ...