基本类型和包装类型的区别
这 8 种基本数据类型的默认值以及所占空间的大小如下:
6 种数字类型 :byte、short、int、long、float、double
1 种字符类型:char
1 种布尔型:boolean。
这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。
== 包装类型不赋值就是 Null ,而基本类型有默认值,且不是 Null。 ==
基本数据类型直接存放在 Java 虚拟机栈中的局部变量表中,而包装类型属于对象类型,我们知道对象实例都存在于堆中。相比于对象类型, 基本数据类型占用的空间非常小。
一、包装类型可以为 null,而基本类型不可以
数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException 的异常
二、包装类型可用于泛型,而基本类型不可以
泛型不能使用基本类型,因为使用基本类型时会编译出错。
List list = new ArrayList<>(); // 提示 Syntax error, insert “Dimensions” to complete ReferenceType
List list = new ArrayList<>();
为什么呢?因为泛型在编译时会进行类型擦除,最后只保留原始类型,而原始类型只能是 Object 类及其子类——基本类型是个特例。
三、基本类型比包装类型更高效
基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。
相比较于基本类型而言,包装类型需要占用更多的内存空间。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过 new 一个包装类型就显得非常笨重。
两个包装类型的值可以相同,但两者并不相等
Integer chenmo = new Integer(10);
Integer wanger = new Integer(10);
System.out.println(chenmo == wanger); // false
System.out.println(chenmo.equals(wanger )); // true
两个包装类型在使用‘ == ’进行判断的时候,判断的是其指向的地址值是否相等。chenmo 和 wanger 两个变量使用了 new 关键字,导致它们在使用‘ == ’比较的时候输出了 false。
而 chenmo.equals(wanger) 的输出结果为 true,是因为 equals 方法内部比较的是两个 int 值是否相等。源码如下。
private final int value;
public int intValue() {
return value;
}
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
虽然 chenmo 和 wanger 的值都是 10,但他们并不相等。换句话说就是:将“==”操作符应用于包装类型比较的时候,其结果很可能会和预期的不符。
四、自动装箱和自动拆箱
把基本类型转换成包装类型的过程叫做装箱(boxing)。
把包装类型转换成基本类型的过程叫做拆箱(unboxing)。
自动装箱是通过 Integer.valueOf() 完成的;自动拆箱是通过 Integer.intValue() 完成的。
五、深拷贝 vs 浅拷贝
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。