文章目录
- 1. 引入
- 2. 装箱和拆箱
- 3. 基本数据类型和包装类的区别:
- 4. 参考
1. 引入
在图形化理解Java中的形参和实参中,我们知道Java中八大基本数据类型,同样也知道了它们各自的取值范围和默认的初始值。那么,既然已经有基本数据类型使用,为什么还要使用包装类呢?Java是一门面向对象的编程语言,而基本数据类型并不具备面向对象的特点,因此包装类的引入是为了让基本类型具有对象的特点;另一方面包装类也方便了泛型的使用。
例如:如果希望向ArrayList当中存储基本数据类型,必须使用基本数据类型对应的包装类:
基本数据类型 | 默认值 | 包装类 | 默认值 |
byte | 0 | Byte | null |
short | 0 | Short | null |
int | 0 | Integer | null |
long | 0 | Long | null |
float | 0.0 | Float | null |
double | 0.0 | Double | null |
char | 空 | Character | null |
boolean | false | Boolean | null |
例如,Integer在ArrayList中的使用如下所示:
public class Test{
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
System.out.println(list);
for(Integer ele : list) {
System.out.println(ele);
}
}
}
2. 装箱和拆箱
装箱和拆箱表示的是 基本数据类型和包装类型之间的相互转换。其中:
- 装箱:指基本类型到包装类型的转换
- 构造方法,以Integer为例,主要有如下两个构造方法:
-
Integer(int value)
:构造新的Integer对象用于表示指定的int值,已过时 -
Integer(String s)
:构造新的Integer对象用于表示指定的同String表示int值,已过时
- 静态方法:
static Integer valueOf(int i)
static Integer valueOf(String s)
- 拆箱:指包装类型到基本数据类型的转换
int intValue()
- 其他类型原理类似
public class Test{
public static void main(String[] args) {
// 构造方法
Integer i = new Integer(24);
System.out.println(i); // 24
Integer i1 = new Integer("24");
System.out.println(i1); // 24
// 静态方法
Integer i2 = Integer.valueOf(24);
Integer i3 = Integer.valueOf("24");
System.out.println(i2); // 24
System.out.println(i3); // 24
// 拆箱
int number= i.intValue();
System.out.println(number); // 24
}
}
基本数据类型和包装类之间的自动转换就称为自动装箱和自动拆箱:
- 自动装箱:
基本类型 -> 包装类型
public class Test {
public static void main(String[] args) {
// 自动装箱
int number = 8;
Integer x = new Integer(number);
System.out.println(x); // 8
System.out.println(x.getClass()); // class java.lang.Integer
}
}
如上所示,我们首先定义一个int型的变量并赋值8,然后new一个Integer对象并将number传入。通过输出可以看出:x的值和number的值相等,并且此时x的类就是int对应的包装类Integer。其他基本类型数据到对应包装类的转换同理,都可以通过自动装箱实现。
- 自动拆箱:
包装类型 -> 基本类型
public class Test {
public static void main(String[] args) {
// 自动拆箱
Integer y = new Integer(24);
System.out.println(y);
System.out.println(y.getClass());
int n = y;
System.out.println(n);
}
}
自动拆箱流程和上面的自动装箱相逆,即将包装类转换为对应的基本数据类型。
以Integer为例,自动装箱机制是调用了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);
}
而自动拆箱调用intValue()
方法实现:
public int intValue() {
return value;
}
3. 基本数据类型和包装类的区别:
- 基本类型不能使用new关键字来创建,而包装类作为类处理,那么包装类型必须使用new关键字来创建
- 存储的位置不同,基本类型存储在栈区,包装类型存储在堆区
- 初始值不同。基本类型中的int初始值为0,boolean初始值为false;包装类型初始值都为null
因此在进行自动装拆箱时一定要避免空指针异常
- 使用场景不同,基本类型主要用于计算和赋值,包装类型用于泛型
- 基本类型是值传递,包装类型是引用传递
4. 参考