为什么要有包装类,顺便说一说基本数据类型该如何转换?
一、前言
- 开门见山,首先看看八种基本数据类型对应的包装类:
基本数据类型 | 包装类 |
---|---|
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
其中Character 、Boolean的父类是Object,其余的父类是Number
二、装箱和拆箱
- 自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。JDK1.5后,Java引入了自动装箱(autoboxing)/拆箱(unboxing)。
- 自动装箱:在JDK1.5以前,代码 Integer i = 10是错误的,必须要通过Integer i = new Integer(10)这样的语句来实现基本数据类型转换成包装类的过程;而在JDK1.5以后,Java提供了自动装箱的功能,自动装箱过程是通过调用包装类的valueOf()方法实现的,因此只需Integer i = 10这样的语句就能实现基本数据类型转换成包装类,这是因为JVM为我们执行了Integer i = Integer.valueOf(10)这样的操作。
public void test1() { Integer a = 10; //等价于 Integer a = Integer.valueOf(10); }
- 自动拆箱:每当需要一个值时,对象会自动转成基本数据类型,没必要再去显式调用intValue()、doubleValue()等转型方法。自动拆箱过程是通过调用包装类的 xxxValue()方法实现的
public void test1() { int a = new Integer(10); //等价于int a = new Integer(10).intValue(); }
三、空指针异常
既然知道了装箱和拆箱,那么下面的代码,我们就可以很明白的分析出来为什么会报空指针的异常了:
public void test1() { Integer a = null; int b = a; }
四、转换的使用
前面已经讲解了基本数据类型以及包装类之间的相互转换,即自动装箱和拆箱;下面看看基本数据类型与String类之间的转换、String类与包装类之间的转换。
1、基本数据类型与String类之间的转换
- 基本数据类型到String类:调用valueOf()
public void test1() { int a = 3; String s = String.valueOf(a); System.out.println(s.getClass()); //class java.lang.String }
- String类到基本数据类型:调用parseXxx()
public void test2() { String s = "12"; int a = Integer.parseInt(s); }
2、String类与包装类之间的转换
- String类到包装类:使用构造器
public void test3() { String s = "12"; Integer a = new Integer(s); System.out.println(a.getClass()); //class java.lang.Integer }
- 包装类到String类:
public void test4() { Integer a = new Integer(12); String s = a.toString(); String s1 = Integer.toString(a); System.out.println(s.getClass()); System.out.println(s1.getClass()); //class java.lang.String } 复制代码
五、经典面试题
试着写一写,看看自己会不会:
@Test public void test5() { Integer i = new Integer(1); Integer j = new Integer(1); System.out.println(i == j); Integer m = 1; Integer n = 1; System.out.println(m == n); Integer x = 128; Integer y = 128; System.out.println(x == y); } 复制代码
输出结果:false、true、false