1. 基本数据类型
JAVA 提供了两个类型系统:基本数据类型、引用类型。其中,基本数据类型是我们编程中使用最频繁的类型
Java 是一种强类型语言,第一次申明变量时,必须要指明数据类型。第一次为变量赋值称为变量的初始化
Java 基本类型共有八种,基本类型可以分为三类:
- 字符类型:char
- 布尔类型:boolean
- 数值类型:byte、short、int、long、float、double
那么,使用基本数据类型有什么好处?
在 Java 语言中,new 一个对象存储在堆中,并通过栈内存的引用来使用此对象。对于我们经常操作的数据类型来说,每次创建对象,都会比较消耗资源。
而对于基本数据类型来说,其值是直接存储在栈内存中,不需要 new 对象。因此,基本数据类型操作起来更方便、高效。
2. 包装类型
Java 语言是一个面向对象的语言,但是 Java 中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)
8 大基本数据类型和其对应的包装类:
基本数据类型 | 包装类(位于 java.lang 包中) |
---|---|
byte | Byte |
short | Short |
int | Integer |
float | Float |
long | Long |
double | Double |
char | Character |
boolean | Boolean |
既然 Java 中为了提高效率,提供了八种基本数据类型,为什么还要提供包装类呢?
简单来说,就是让基本数据类型的变量具有类中对象的特征 ------ 有对应的方法来操作这些基本类型的数据
基本数据类型,虽然使用起来非常方便,但是没有对应的方法来操作这些基本类型的数据。而且,对于Java这种种面向对象语言来说,很多地方都需要使用对象而不是基本数据类型。如:集合类。因为,集合类中要求元素的数据类型是 Object 类型。那么,你是无法将 int、long 等基本数据类型放入其中的。
为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
3. 装箱与拆箱
基本类型与对应的包装类型对象之间,互相转换的过程称为“装箱”、“拆箱”
- 装箱:从基本类型转换为对应的包装类对象
- 拆箱:从包装类对象转换为对应的基本类型
以 int 与 Integer 为例:
基本类型 ==> 包装类对象
// 使用构造方法
Integer integer = new Integer(1);
// 使用 Integer.valueOf() 方法
Integer integer2 = Integer.valueOf(1)
包装类对象 ==> 基本类型
Integer integer = new Integer(1);
int num = integer.intValue();
4. 自动装箱与自动拆箱
在 Java SE5 中,为了减少开发人员的工作,Java 提供了自动拆箱与自动装箱功能
- 自动装箱: 就是将基本数据类型自动转换成对应的包装类
- 自动拆箱:就是将包装类自动转换成对应的基本数据类型
// 自动装箱
Integer integer = 6;
// 自动拆箱
int i = integer;
那么,自动装箱、自动拆箱功能到底是如何做到的呢?
如:
public static void main(String[] args) {
// 自动装箱
Integer integer = 6;
// 自动拆箱
int i = integer;
}
将此代码进行反编译后:
public static void main(String[] args) {
Integer integer = Integer.valueOf(6);
int i = integer.intValue();
}
发现:
- int 类型数据自动装箱时:调用的是 Integer.valueOf() 方法
- Integer 类型自动拆箱时:调用的是 Integer#intValue() 方法
那咋们再试试其它类型,如 long 类型:
public static void main(String[] args) {
Integer integer = 6;
int i = integer;
Long l = 7L;
long ll = l;
}
反编译后:
public static void main(String[] args) {
Integer integer = Integer.valueOf(6);
int i = integer.intValue();
Long l = Long.valueOf(7L);
long ll = l.longValue();
}
【总结】:对于 8 大包装类型而言,自动装箱就是调用 包装类.valueOf() 方法
;自动拆箱就是调用 包装类对象.xxValue() 方法
5. 自动拆装箱的应用场景
场景一:将基本数据类型放入集合中
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
反编译后:
List<Integer> list = new ArrayList();
// 自动装箱
list.add(Integer.valueOf(1));
list.add(Integer.valueOf(2));
当把基本数据类型放入集合中时,会将基本数据类型 自动装箱
场景二:将基本数据类型与包装类型进行运算
Integer integer = 1;
int i = 1 + integer;
反编译后:
Integer integer = Integer.valueOf(1);
int i = 1 + integer.intValue();
将基本数据类型与包装类型进行运算时,包装类型会进行 自动拆箱