Java 自动拆箱和自动装箱学习笔记

详情参考以下

1. 概述

Java 中的自动装箱和自动拆箱算是一种语法糖,也就是在编译阶段编译器在合适的情况下帮我们的做了自动拆箱和自动装箱。

众所周知,Java 中的基本数据类型并不是对象,为了解决在一定切情况下我们需要使用对象的时候,Java 为我们提供了每个基本类型对应的包装类,如下表:

基本数据类型

数据类型包装类

byte(1字节)

Byte

short(2个字节)

Short

int(4个字节)

Integer

long(8个字节)

Long

float(4个字节)

Float

double(8个字节)

Double

boolean

Boolean

当基本数据类型转换成数据类型包装类时,称之为装箱;

当数据类型包装类转换成基本数据类型时,称之为拆箱。

Integer i = 10; // 装箱

int num = i; // 拆箱

2. 自动拆箱和自动装箱的实现原理。

对于上面一段代码进行反编译可以得到:

0: bipush 10

2: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

5: astore_1

6: aload_1

7: invokevirtual #3 // Method java/lang/Integer.intValue:()I

10: istore_2

11: return

可以看出:装箱是Integer.valueOf() 方法,而拆箱是调用Integer.intValue() 方法,其他类型亦是如此。装箱时调用包装类的valueOf()方法,拆箱是调用包装类xxValue()方法。

3. 自动拆箱和自动装箱的发生时机

在下面的两种情况时,会发生自动装箱:

基本类型作为参数传递到相应的包装类型方法

基本类型分配到相应的包装类型变量

对应如下代码:

// 基本类型作为参数传递到相应的包装类型方法

List li = new ArrayList<>();

for (int i = 1; i < 50; i += 2)

li.add(i);

// 基本类型分配到相应的包装类型变量

Integer i = 10;

在下面的两种情况时,会发生自动拆箱:

包装类型作为参数传递给基本类型的方法

包装类型分配到基本类型的变量

同时在进行 +,- 时,也会发生自动拆箱,因为 Integer 或其他包装类型对象无法使用运算符。所以编译时,如果包装类型使用运算符进行运算,会先进行自动拆箱再进行运算。

还有一种情况,就是在使用三目运算符的情况下,可能会发生自动拆箱。当返回的两个参数并不是同一种数据类型时,编译器会进行自动拆箱,向下转型。只要一个运算中有不同的类型,涉及到类型转换,那么编译器会往下(基本类型)转型,再进行运算,如下:

Double db1 = null;

Long l2 = null;

boolean flag =false;

Double db2 = (flag) ? db1 : l2;

其中 db1 l2 不是同一种类型的参数,编译器会进行自动拆箱。

对应如下代码:

// 包装类型作为参数传递给基本类型的方法

Integer i = new Integer(10);

int i2 = getIntVal(i);

private static int getIntVal(int i){

return i;

}

// 基本类型分配到相应的包装类型变量

int i = new Integer(10);

4. 关于包装类 valueOf() 方法

首先看下面一段代码:

Integer i1 = 10;

Integer i2 = 10;

Integer i3 = 200;

Integer i4 = 200;

System.out.println(i1 == i2); // true

System.out.println(i3 == i4); // false

为什么会产生上面的情况,前面提到,自动装箱调用的时valueOf() 方法,所以先看一下valueOf() 的源码:

public static Integer valueOf(int i) {

// IntegerCache.low == -128 IntegerCache.high == 127

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

这段代码的意思时,每次调用Integer.valueOf() 方法时,如果在-128-127之间就会直接从缓存中取。这样做的原因是,我们在使用Integer 时大部分使用的数字都较小,这样可以提高效率,节省空间。

不仅仅是Integer,其他包装类有缓存:

Boolean 缓存了 Booelan.TRUE 和 Booelan.FALSE

Short 缓存了 -128 - 127 之间的值

Long 缓存了 -128 - 127 之间的值

Byte 数值有限,所以全部都被缓存。

Character 缓存了'\u0000' 到 '\u007F'

只有double和float的自动装箱代码没有使用缓存,而double、float是浮点型的,没有特别的热的(经常使用到的)数据的,缓存效果没有其它几种类型使用效率高

5. 自动拆箱和自动装箱的优缺点

自动拆箱和自动装箱的引入方便了我们编写程序,提高编程效率

虽然自动拆箱和自动装箱很方便,但是我们在使用是需要注意自动拆装箱所带来的问题:

由于包装类型是对象,就可能在我们不经意的情况下产生了空指针异常。如果对一个空的包装类型对象进行拆箱操作,就会抛出空指针异常。

自动拆装箱会较为消耗性能,在性能敏感且操作数量大的情况下,性能会明显下降。

所以要建议避免无意中的装箱、拆箱行为

java 包装类缺点_Java 自动拆箱和自动装箱学习笔记相关推荐

  1. Java进阶之自动拆箱与自动装箱

    序. java基本类型介绍 java中,基本数据类型一共有8种,详细信息如下表: 类型 大小 范围 默认值 byte 8 -128 - 127 0 short 16 -32768 - 32768 0 ...

  2. 如何理解Java中的自动拆箱和自动装箱?

    小伟刚毕业时面的第一家公司就被面试官给问住了,记忆尤深啊- 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这-这-知识盲区- 回到家后小伟赶紧查资料,我透,这不就 ...

  3. 如何理解Java自动装箱_如何理解Java中的自动拆箱和自动装箱?

    如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢... ...

  4. 包装类和自动拆箱与自动装箱

    包装类 /*目标:学习包装类的应用包装类的应用:1.包装类作为泛型.2.基本类型转字符串.3.字符串转基本类型.(重点)*/ public class Demo1 {public static voi ...

  5. 什么是自动拆箱和自动装箱

    什么是自动拆箱和自动装箱 Java中基本类型有八种,可以分为四类: 整形: byte(一个字节来存储,范围为-2^7- 2^7-1), short (两个字节来存储,范围为-2^15- 2^15-1) ...

  6. Java语言基础(常见对象3(数组排序(冒泡排序、选择排序、直接插入排序、快速排序、归并排序)、Arrays、基本数据类型包装类、Integer类、自动拆箱、自动装箱))

    Java语言基础 常见对象 数组排序 冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值的元素就会出现在最大索引处:以此循环 //冒泡排序:public static void main(St ...

  7. java 自动装箱自动拆箱_自动装箱和自动拆箱

    自动装箱和自动拆箱 Java 提供了 8 种基本数据类型,每种数据类型都有其对应的包装类型,包装类是面向对象的类,是一种高级的数据类型,可以进行一些比较复杂的操作,它们是引用类型而不再基本类型了. 基 ...

  8. Integer及String的equals及==注意示例,涉及自动拆箱、自动装箱以及equals源码分析

    1. 只要不是创建的Integer对象,那么 -128--127 范围内的数都是相等的,因为不是创建的Integer对象,不管Integer对象是直接赋值,还是调用parseInt,最终都是通过val ...

  9. 【java基础】包装类,自动装箱和自动拆箱

    文章目录 基本介绍 包装类 自动装箱 自动拆箱 包装类注意事项 包装类比较 包装器内容不可变 基本介绍 有时,需要将int这样的基本类型转换为对象.所有的基本类型都有一个与之对应的类. 例如,Inte ...

最新文章

  1. python 链式比较 2._特色的Python序列解包、链式赋值、链式比较
  2. 什么是MVP架构模式(Model、View、Presenter)?(软件设计模式MVC、MVVW)
  3. 2021-11-18Collections
  4. android布局的一些知识
  5. 训练yolo V4模型调优的十个建议
  6. java存款输入密码类,创建一个银行账户类,包括账号、用户姓名、密码和余额属性,实现开户、查询余额、取款、存款功能。...
  7. 续《用最简单的例子实现jQuery图片即时上传》之多图上传实现
  8. K-Means K均值算法python实现 (包括绘图)
  9. 别人家的公司年终奖52个月工资-互联网企业年终裁员脸在哪
  10. 35岁的程序员:第30章,表白
  11. 三菱系统m70计算机连接错误,这可能是最齐全的三菱M70错误代码大全了
  12. 1758. Minimum Changes To Make Alternating Binary String
  13. 苹果三代耳机_airpods三代上市时间 苹果第三代蓝牙耳机什么时候上市
  14. 剑三重置版找不到服务器,剑网3重制版客户端常见问题处理方案整理
  15. XML 中的延时等待控制函数Wait
  16. java8常见的stream流处理
  17. java实例化对象例子
  18. Android本地数据存储: Reservoir
  19. 中国污水处理行业发展环境深度分析及十四五投资机会评估报告2022-2028年版
  20. Java数据结构和算法(总结)

热门文章

  1. 万物的解释 —— 微波炉的工作原理
  2. matlab 随机函数的使用
  3. python电脑下载-python
  4. python和java学哪个好-Python和Java该学哪个?还在纠结的你看过来呀~
  5. python官网下载文件-使用Python下载文件的简单示例
  6. python基础教程-《Python基础教程(第3版)》PDF高清版
  7. python3安装步骤-Mac安装python3的方法步骤
  8. python编程入门必备知识-Python快速编程入门,打牢基础必须知道的11个知识点
  9. 讯飞输入法将深度神经网络DNN技术应用于语音识别达到业界领先水平
  10. 输入指定答案提示正确C语言,大学C语言课件及复习答案输入输出.ppt