大家好,欢迎来到程序视点
!我是小二哥。
前言
在之前的文章中,我们提到过Java种的8种基本类型:byte、short、int、long、float、double、char、boolean。大家肯定非常熟悉了。
我们知道每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double。
有了基本类型,又弄出个包装类型,这是为什么呢?面试场上很容易出现这样的考题,就是想看看你基础好不好。
基本类型和包装类型
要想知道为什么有了基本类型后,还出现包装类型,就需要先分辨出它们的区别。
基本类型有初始值,而包装类型的默认值是null
这也说明了一个点:包装类型可以为 null,而基本类型不可以为null。别小看这一点区别,它使得包装类型可以应用于 POJO(Plain Ordinary Java Object) 中,而基本类型则不行。
为什么呢?《阿里巴巴 Java 开发手册》上有详细的说明,可以帮助我们理解这一点。
【强制】所有的POJO类属性必须使用包装数据类型。 正例:数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException 的异常。
包装类型可用于泛型,而基本类型不可以
举个例子:
代码语言:javascript复制List<int> a = new ArrayList<>();
如果我们像上面这么写,编译器会报错:Type argument cannot be of primitive type
(类型参数不能为基本类型)
这又是为什么呢?因为泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做类型擦除,最后只保留原始类型,而原始类型只能是 Object 类及其子类。而int基本类型不是Object类或Object的子类。
存储位置不同
基本数据类型作为局部变量存放在 Java 虚拟机栈中的局部变量表中。基本数据类型作为成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。
我们知道,在栈中的数据,在弹栈后,数据就没有了。假如没有包装类型,那么想要留存的一些数据可能在弹栈后就没有了。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过 new 一个包装类型就显得非常笨重。这就引出下一个不同点。
空间占用不同
基本数据类型占用的空间往往非常小,且是固定的。包装类型是对象类型,想想对象的结构,占用的空间就比基本类型要大一些了。
使用“==”进行判断时的不同
我们来看一个例子:
代码语言:javascript复制Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a == b); // false
System.out.println(a.equals(b )); // true
包装类型是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,因此在使用 == 进行判断的时候,判断的是其指向的地址是否相等,若想判断它们的内容是否相等,需要使用equals()方法。而基本类型使用 == 直接判断其值是否相等。
小结
关于基本类型和包装类型间的差别,大家心里都大略有些概念。但就是细说的时候理不清楚。以上就是它们之间的区别,也就回答了我们标题中的问题。我们往往对有些知识是知道的,但真让我们表达的时候,却说不出一个所以然来。因此,我们要多见一些问题,多看看别人的思考的方向,以便后以后碰到新问题时,能给我们提示些方向。
好啦!今天就到这里啦~~ Bye~bye!