小伟刚毕业时面的第一家公司就被面试官给问住了...
如何理解Java中的自动拆箱和自动装箱?
自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区...
回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢...
别问结果,问就是没过。
1、 什么是自动装箱,自动拆箱定义:基本数据类型和包装类之间可以自动地相互转换
理解:装箱就是自动将基本数据类型转换为封装类型,拆箱就是自动将封装类型转换为基本数据类型。
我们知道,Java中提供了四大类基本数据类型,分别是:整数、浮点数、字符型和布尔型,其中:
整数包含:byte、int、short、long
浮点数包含:float、double
字符类型:char
布尔类型:boolean
基本数据类型相信大家一定很熟悉了吧,来来来,说说他们的取值范围~
数据类型 取值范围byte -128 ~ 127
short -32786 ~ 32767
int -4294967296 ~ 4294967295
long -2^64^ ~ 2^64^ -1
float 3.4e-038 ~ 3.4e+038
double 1.7e-308 ~ 1.7e+308
char \u0000 ~ \uffff
boolean true 、false
日常开发中,靠这些基本数据类型几乎能够满足我们的需求,但是基本类型终究不是对象,往重了说不满足面向对象的开发思想,往轻了说就是使用不方便。怎么讲?例如做一些数据类型转换,获取int数据类型的取值范围等等。
我们知道,类的优点在于它可以定义成员变量、成员方法,提供丰富便利的功能,因此Java在JDK1.0的时候就设计了基本数据类型的包装类,而在JDK1.5中引入了新特性:自动装箱和拆箱。
我们来看一下基本类型跟封装类型之间的对应关系:
数据类型 封装类byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
2、 使用包装类型后的便捷
我们以上边提到的数据类型转换为例,看看使用包装类型后的便捷性。
小伟在数据库中存放商品库存用的是 varchar 类型来存储的,所以在代码中的实体与之对应的是 String,那么问题来了,既然是库存,那么势必就要用到加减乘除之类的运算,所以就需要先转换成 数值类型(int\long\float等)来运算,我们看一下通过包装类是如何快速转换的「int\long\float」:
public class Test { public static void main(String[] args) { // 数据库中的商品数量 number String number = "666"; // 借助封装了 Integer 转换为 int int intVal = Integer.valueOf(number); // 借助封装了 Float 转换为 float float floatVal = Float.valueOf(number); // 借助封装了 Long 转换为 long long longVal = Long.valueOf(number); // 依次输出三个值的内容 System.out.println("int="+intVal); System.out.println("floatVal="+floatVal); System.out.println("longVal="+longVal); } } 3、 落实自动装箱、拆箱看完了包装类型的便捷性后,我们再来落实到自动装箱、自动拆箱上...
怎么就自动装箱,自动拆箱了呢?
上一段代码,看看哪是自动装箱跟自动拆箱:
// 自动装箱 1. Integer a = 100; // 自动拆箱 2. int b = a;自动装箱,相当于Java编译器替我们执行了 Integer.valueOf(XXX);
自动拆箱,相当于Java编译器替我们执行了Integer.intValue(XXX);
我们证实一下,首先通过 javac 编译得到 class 文件,接着反编译看看:
指令为:javap -c class文件名,得到下图所示: