面试官:为什么有了基本类型,还需要包装类型呢?

2023-11-09 17:23:35 浏览数 (1)

将程序视点设为星标精品文章第一时间阅读

大家好,欢迎来到程序视点!我是小二哥。

前言

在之前的文章中,我们提到过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!

0 人点赞