自动装箱和自动拆箱

那么Java中有八大基本数据类型,byte、char、short、int、long、double、float、boolean。而它们有对应的包装类

Byte、Character、Short、Integer、Long、Double、Float、Boolean,这样通过包装后,它们就成为了引用数据类型

那么基本数据类型怎么变成对应的包装类呢?

手动装箱

在jdk1.5之前呢,是没有自动装箱的功能的,那么只能由我们编写代码手动装箱!将int类型装箱为Integer类型

public void test() {int i = 10;// 手动装箱Integer a = new Integer(i);// 手动拆箱int i1 = a.intValue();System.out.println(i1);
}

自动装箱

我们就拿Integer为例,在jdk5之后就有了自动装箱/拆箱功能

public void test() {// 自动装箱,底层使用的是Integer.valueOf(10)方法,返回一个Integer对象Integer a = 10;// 自动拆箱,底层使用的是Integer.intValue()方法int b = a;
}

通过字节码的角度我们可以看得更加清晰!

我们来看看这个Integer.valueOf()方法为我们做了些什么,点进源码中

public static Integer valueOf(int i) {// 首先它会去缓存中查看是否有这个值if (i >= IntegerCache.low && i <= IntegerCache.high)// 缓存中有直接返回缓存中的值return IntegerCache.cache[i + (-IntegerCache.low)];// 否则直接返回这个包装后的对象return new Integer(i);}

这个缓存池中的范围是多少呢?

那么从源码中看出缓存的数据为[-128,127],则从缓存中获取对象,那么现在来做一道笔试题

public void test() {Integer a = new Integer(3);Integer b = new Integer(3);System.out.println(a == b);Integer c = 3;Integer d = 3;System.out.println(c == d);Integer e = 128;Integer f = 128;System.out.println(e == f);
}

问输出结果是多少?那么这题呢第一个输出为false,第二个输出为true。因为对象a和对象b都是以new的方式创建对象,

不会从缓存中获取对象,那么这两个是不同的对象,即使它们的值都一样!

对象c和对象d就是自动装箱的过程,其底层会调用Integer.valueOf()方法,从缓存池中获取对象,其底层缓存池是从类加载的时候就存在的

 static final Integer cache[];       // static和fianl修饰的缓存池

那么从中获取的两个对象也必定相同!

对象e和对象f,因为超过了缓存池中的范围,它就直接返回一个Integer对象,那么调用两次肯定是不同的对象,所以返回false。

自动拆箱

其底层是使用了intValue()方法,我们点进源码中

可以看见,其返回的是一个int值,那么我们就很清楚为什么它可以直接赋值给int类型了,其底层就是调用了intValue()方法自动拆箱。

Java自动装箱/拆箱相关推荐

  1. java自动装箱拆箱原理

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

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

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

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

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

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

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

  5. 深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)

    1.自动装箱与拆箱的定义 装箱就是自动将基本数据类型转换为包装器类型(int-->Integer): 拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int). Java中 ...

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

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

  7. JAVA 自动装箱拆箱

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

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

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

  9. Java自动装箱拆箱

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

最新文章

  1. 只改一个值!马上加快宽带上网速度
  2. (0079)iOS开发之安全策略之HTTPS(1)
  3. Ubuntu18.04下安装RRStudio
  4. 技术开发(委托)合同怎么写?
  5. 最全python爬虫库安装详解
  6. centos 虚拟机 使用串口_在VMware虚拟机环境下安装CentOS 7操作系统
  7. java 创建静态方法_Java 在静态方法中创建Local类
  8. js 连mysql 延后_详解MySQL 主从同步延迟
  9. @vue-cli的安装及vue项目创建
  10. 深度学习优化算法大全系列2: Momentum(动量)
  11. 靠一颗火锅丸子弯道超车三全,安井到底凭什么?
  12. Java Web研发工程师新手入门指南
  13. http1,http1.1,http2及http3
  14. 某月某日前包括当天吗_几号之前包括当天吗
  15. Shard Architechure
  16. 物联网之云平台搭建与大数据处理期末复习总结一
  17. 史上最全鱼骨图分析法
  18. 【python 图片识别】python识别图片是不是包含二维码
  19. 申请微信公众号需要哪些材料
  20. hdu2894// 算法竞赛——进阶指南——acwing 400. 太鼓达人 欧拉回路经典题 //欧拉回路的建模小结

热门文章

  1. delphi html 表格控件,Delphi TTable 组件
  2. 微量元素分析仪中药元素可抗衰老
  3. Linux——磁盘在网络中共享
  4. 白话科普:如何训练ChatGPT,能用它来挣钱吗?【P.S. 今晚19:30,说透ChatGPT】
  5. CodeForces 360A - Levko and Array Recovery【动规】
  6. 信息安全数学基础-素数模高次同余方程 2021-10-09
  7. php $delaytime /= $delaytime,定时器之延时触发鼠标悬浮事件
  8. 如何克服心理恐惧--转
  9. c语言实现,将字母变成其后面的第4个字母,其它字符保持不变。
  10. 【5G NR】NAS连接管理—CM状态