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 ...
随机推荐
- vue组件之间的传参
vue组件之间传参有三种传参方式'父传子','子传父','非父子组件之间传值' 父传子 父组件 <template> <CounterCom :num="5"&g ...
- go标准库之fmt
go标准库之fmt fmt库 Print系列 1. Print 不换行 2. Println 换行 3. Printf 不换行,可以使用格式化占位符 格式化占位符 占位符 说明 通用 --- %v 值 ...
- Cloud9 3.0 SDK安装
Cloud9 IDE是一个基于Node.JS构建的JavaScript程序开发Web IDE.它拥有一个非常快的文本编辑器支持为JS, HTML, CSS和这几种的混合代码进行着色显示.Cloud9 ...
- C语言学习--练习--合并两个字符串
将两个字符串合并追加在一起, 类似于python的str1+str2 #include<stdio.h> #include<string.h> #include<stdl ...
- 第四章:基本Git概念(重点)
本章通过讨论Git的基本架构组成和一些重要概念,来探讨Git的不同之处和原因. 一: 基本概念 1.版本库. 1]Git版本库只是一个简单的数据库,包含所有用来维护与管理项目的修订版本和历史记录. 2 ...
- ARC(Automatic Reference Counting)自动引用计数 unowned、weak 使用区别
自动引用计数 引用类型(类.函数.闭包) 当声明一个变量指向某个引用类型时 当前引用类型的引用计数就会加1 当变量不指向该类型时 引用类型就会 -1 当引用计数为0时 当前引用类型就会被系统回收 i ...
- ts补充
// ts中类型主要包括 1.元组 2.接口(对象,函数,构造器)类型 3.枚举类型 4.字面量类型 5.特殊类型 // ts中类型类型运算主要包括 1.条件类型 : 2.推导类型 3.联合类型 4. ...
- 笛卡尔树 Cartesian tree
给个板子题 笛卡尔树是这样的一种数据结构:对于 \(n\) 个二元组 \((key, value)\) 形成的笛卡尔树,满足如下性质 其 \(key\) 值满足二叉搜索树性质 (中序排列单调递增),\ ...
- 12. Redis 安装
参考http://www.runoob.com/redis/redis-install.html Window 下安装 下载地址:https://github.com/MSOpenTech/redis ...
- 版图 shrink
先打开模拟部分的版图,然后在ciw 里面执行 dbCreateXFormPCell(geGetEditCellView() "libName") 然后在"libName& ...