1、自动装箱与拆箱的定义

装箱就是自动将基本数据类型转换为包装器类型(int-->Integer);

拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)。

Java中的数据类型分为两类:一类是基本数据类型,另一类是引用数据类型。如下图:

由上可知Java中的基本数据类型有八种分别是:int(4字节) byte(1字节) short(2字节) long(8字节) float (4字节) double(8字节) char(2字节) boolean(1byte)基本数据类型不是对象,不能使用对象的方法。将基本数据类型转换为对象就是自动装箱的过程。下面是基本数据类型与封装器类之间对应的关系。

基本类型 二进制位数 分装类
int 32(4字节) Integer
byte 8(1字节) Byte
long 64(8字节) Long
short 16(2字节) Short
float 32(4字节) Float
double 64(8字节) Double
char 16(2字节) Character
boolean 1(1/8字节) Boolean

2、自动装箱

public static void main(String[] args) {int a=3;//定义一个基本数据类型的变量a赋值3Integer b=a;//b是Integer 类定义的对象,直接用int 类型的a赋值    System.out.println(b);//打印结果为3
}

上面的代码中 Integer b=a; 一个对象怎么赋值成了基本数据类型的变量,其实这就是自动装箱的过程,上面程序在执行Integer b=a;的时候调用了Integer.valueOf ( int i ) 方法,Integer b=a; 这段代码等同于:Integer b=Integer.valueOf ( a ) 。下面是对 Integer.valueOf ( int i ) 方法简化后的源码:

public static Integer valueOf(int i) {       if (i >= -128 && i <= 127)return IntegerCache.cache[i + 127];//如果i的值大于-128小于127则返回一个缓冲区中已存在的一个Integer对象return new Integer(i);//否则返回 new 一个Integer 对象
}

可以看到Integer.valueOf ( a )其实是返回了一个Integer的对象。因此由于自动装箱的存在Integer b=a 这段代码是没有毛病的。其实更简化的来写可以这样:Integer b=3,同样这段代码等价于:Integer b=Integer.valueOf (3 ) 。

上面的这段代码中:IntegerCache.cache[i + 127],下面是简化后的源码:

private static class IntegerCache {static final Integer cache[];//定义一个Integer类型的数组且数组不可变static {  //利用静态代码块对数组进行初始化。                     cache = new Integer[256];int j = -128;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}//cache[]原来是一个Integer 类型的数组(也可以称为常量池),value 从-128到127,public static Integer valueOf(int i) {   if (i >=-128 && i <= 127)        return IntegerCache.cache[i + (-IntegerCache.low)];//如果装箱时值在-128到127之间,之间返回常量池中的已经初始化后的Integer对象。return new Integer(i);//否则返回一个新的对象。}
}

从上面代码可知,IntegerCache 类在初始化的时候,生成了一个大小为 256 的integer 对象的常量池,并且integer.val 的值从-128-127之内,在自动装箱时候,基本数据类型在该范围内的,则直接从该缓存区获取对应的Ingeter对象并返回,超出该范围,则重新创建Ingeter对象并返回;

3、自动拆箱

public static void main(String[] args) {Integer b=new Integer(3);//b为Integer的对象int a=b;//a为一个int的基本数据类型System.out.println(a);//打印输出3。}

当封装类自动拆箱时,其实 int a=b,自动调用了b.intValue()方法,这段代码等价于:int a=b.intValue(),来看看inValue()方法到底是什么,下面是源码:

//自动拆箱时调用的方法,并直接返回基本数据类型
public int intValue() {return value;
}
private final int value;
//而自动装箱时,通过构造函数创建对应的封装类,并将该基本数据类型赋值给该类的静态成员变量
public Integer(int value) {this.value = value;
}

4、相关题目

自动装箱和拆箱已经解决了,看看下面的代码输出什么:

public static void main(String[] args) {        //1Integer a=new Integer(123);Integer b=new Integer(123);System.out.println(a==b);//输出 false//分别创建两个封装类对象,比较的对象的引用类型变量,则不相等//2 Integer c=123;Integer d=123;  System.out.println(c==d);//输出 true//对于同一个值,且值在-128~127范围内,自动装箱时直接返回缓存区已存在的Ingeter对象,则他们的引用类型变量是相等的,c、f为指向同一个对象//3Integer e=129;Integer f=129;System.out.println(e==f);//输出 false//自动装箱时,值超过了-128~127范围内,重新创建Ingeter对象,则e、f为指向两个对象//4int g=59;Integer h=new Integer(59);System.out.println(g==h);//输出 true//当一个基本数据类型,跟封装类做对比时,封装类会自动拆箱成基本数据类型,然后再比较值得大小}

深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)相关推荐

  1. java进阶--深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)

    1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型:拆箱就是 自动将包装器类型转换为基本数据类型. Java中的数据类型分为两类:一类是基本数据类型,另一类是引用数据类型.如下图: ...

  2. java自动装箱拆箱原理

    java自动装箱拆箱原理 看了很多博主都没写原理,只是浅显地说了自动装箱拆箱的含义,我就把这个必须知道的知识写一下吧 1.自动装箱 以int -> Integer为例,Integer integ ...

  3. java自动装箱拆箱深入剖析

    这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆:  java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装 ...

  4. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  5. Java自动装箱/拆箱

    自动装箱和自动拆箱 那么Java中有八大基本数据类型,byte.char.short.int.long.double.float.boolean.而它们有对应的包装类 Byte.Character.S ...

  6. java 自动装箱拆箱_java——自动装箱拆箱

    讲一下JDK 5 引入的自动装箱与拆箱 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使 ...

  7. Java 自动装箱拆箱原理及避坑

    简单记录一下自动拆装箱原理以及使用过程中要注意的坑. 目录 1.Java基本数据类型 2.自动拆箱.自动装箱 3.避坑问题 1.Java基本数据类型 基本数据类型和与之对应的包装类型: boolean ...

  8. JAVA 自动装箱拆箱

    在需要的情况下,基本类型与包装类型可以通用.有些时候我们必须使用引用数据类型时,可以传入基本数据类型. 比如: 基本类型可以使用运算符直接进行计算,但是引用类型不可以.而基本类型包装类作为引用类型的一 ...

  9. Java自动装箱拆箱

    装箱就是自动将基本数据类型转换为包装器类型:拆箱就是 自动将包装器类型转换为基本数据类型. 自动装箱,范围在 -128 ~ 127 [256个数字 ]的地址是一样的,-128 到 127 之间的有个自 ...

最新文章

  1. python变量类型-Python 变量类型详解
  2. Properties 配置文件参数 注入bean中
  3. python中如何调用函数_我写了一个函数,如何在python中调用
  4. PHP闭包(Closure)初探(转载 http://my.oschina.net/melonol/blog/126694?p=2#comments)
  5. springboot连接数据库报错testWhileIdle is true, validationQuery not set
  6. Jmeter(七)Jmeter脚本优化(数据与脚本分离)
  7. 构造方法内的多态问题
  8. Web 上构建MDI 应用程序---Prototype Window Class
  9. qt及qt quick开发实战精解_Qt5实战001:Qt 5.15下载安装详解
  10. [cocos2dx]斗地主制作之洗牌算法
  11. python 狄里克雷平滑_狄里克雷平滑(Dirichlet)、線性插值平滑(Linear Interpolated)、拉普拉斯平滑(Laplacian)...
  12. GB50174-2008《电子信息系统机房设计规范》
  13. 威纶通与三菱PLC条码枪解码程序 本程序是威纶通触摸屏USB接头直接插条形码扫码枪
  14. 太空大战2d游戏制作
  15. CLIP-对比图文多模态预训练的读后感
  16. Photoshop滤镜给城市夜空添加满天星光
  17. 全国计算机职称考试excel2003,全国计算机职称考试excel2003题库及答案电子教案.pdf...
  18. 这十个嵌入式工程师最青睐的树莓派扩展板让你受用半生
  19. MyBatis参数绑定
  20. BI神器Power Query(22)-- 同一列内多重替换(2)

热门文章

  1. QoS基础及技术原理实战——1
  2. python外环是什么意思_爬取上海地铁站并且规划出行路线
  3. cobaltstrike 宏病毒实践
  4. 2022起重机械指挥考试试题及模拟考试
  5. K12467 滞纳金
  6. 天猫淘宝知乎爬虫神器 -- Pyppeteer
  7. 嵌入式代码中一些缩写名词的意义
  8. 为了部落:NVMe over Fabric诞生记
  9. 摄影社区热门小镇(浮动)
  10. 【Python入门】Turtle海龟库:利用海龟画笔绘制简单图形(2)