面试题系列:为什么有了基本类型还要有包装类型?

82 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

作者平台:

本文一共1864字,预计阅读5分钟

前言

前段时间面试的时候,面试官问我java中的基本数据类型有哪些?我巴拉巴拉脱口而出,感觉说的很好,然后面试官继续问,那你知道这些基本数据类型的包装类型吗?我想这题我又会,然后又巴拉巴拉说了一大堆。然后面试官又问,那你知道为什么有了基本数据类型了,还需要有包装类吗?我.......半天支支吾吾说了一些,但是说的不是很好,没有回答到核心的点上,刚好想起来这个,就好好整理下,这个问题的个人的理解和看法!

基本数据类型和包装类型

我们知道java中有八大基本数据类型,它们分别是byte、short、int、long、float、double、char、boolean。

并且java分别为这八大基本数据类型都提供了对应的包装类型,它们的关系如下:

Java中基本数据类型与包装类型有:

  基本类型    包装类型  
booleanBoolean
charCharacter
intInteger
byteByte
shortShort
longLong
floatFloat
doubleDouble

并且二者可以通过自动拆装箱从而实现相互的转换: 1、自动装箱:就是把基本数据类型转换为对应的包装类类型,比如:

int i = 1; 
Integer integer = new Integer(i);

2、自动拆箱:就是把包装类型转换为对应的基本数据类型,比如:

Integer integer = new Integer(1); 
int i = integer.intValue(); 

如果使用编译器输入的时候会发现,包装类会提示是属于java.lang类。 image.png

并且以Integer为例,其源码如下:

image.png

发现其集成了number类并且实现了Comparable接口,Comparable接口很熟悉了,主要用于比较,number抽象类源码如下:

image.png

为什么存在这两种类型呢?

先看下下面的例子:

public class BaseValueDemo {

    public static void main(String[] args) {
        User user = new User(20,2000.00);
        Cat cat = new Cat(20,2000.00);
        System.out.println("user:"+user.age+";"+user.getSalary());
        System.out.println("cat:"+cat.age+";"+cat.getWeight());
    }


}

class User{
    int age;
    double salary;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public User(int age, double salary) {
        this.age = age;
        this.salary = salary;
    }
}

class Cat{
    Integer age;
    Double weight;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Double getWeight() {
        return weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }

    public Cat(Integer age, Double weight) {
        this.age = age;
        this.weight = weight;
    }
}

上述代码,可以发现不管基本数据类型还是包装类型都可以用于表示同一个意思。

image.png

那么为什么还要有这两种类型呢?

java是一门面向对象的编程语言,当我们创建一个对象的时候,其是存储在堆内存中,但是我们可以通过栈中的引用来使用这些对象,试想下如果没有基本数据类型,那么比如int这样的对象,如果我们经常用到,那么就需要将其存储在堆中,并且每次使用都需要new,这样其使用效率明显低下,所以就需要使用一个特别的“对象”,直接将其存储在栈内存中,这样每次使用直接取即可, 而不需要每次new。

那么是不是只需要有基本数据类型就可以了,包装类型可以不需要了呢?还是因为java是面向对象的语言,但是刚刚说到的基本数据类型是直接存在栈内存中的,不需要通过new关键字创建,所以基本数据类型不是一个对象,不具有对象的性质,所以其操作比较单一,如果为了让这些基本数据类型也具有对象的特性,那么就对这些基本数据类型提供了包装类,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

我们在使用ArrayList,HashMap这类的容器时可以发现,比如往hashmap中存储的key或者value是基本数据类型的,则会报错:

image.png

Type argument cannot be of primitive type

这句话意思就是

参数类型不能为基本数据类型

这是因为容器都是装Object对象的,但是如果需要存储比如1,2,3这样的数据,那么就需要这些基本数据类型的包装类型了:

image.png

基本数据类型和包装类型区别:

1、具体使用方式不同:

基本数据类型是直接存储在栈中,使用的时候直接赋值使用即可,但是包装数据类型是一个对象需要通过new关键字使用,并且是存储在堆中。  
2、存储方式及位置不同:

基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;

3、初始值不同:

对于基本数据类型,比如int其初始值为0,但是对于其包装类型都必须声明为null;

4、传递类型不同

包装类型是引用的传递,基本类型是值的传递。

5、使用场景不同

对于基本数据类型直接赋值使用就可以,比如某个类中的字段信息,年龄、体重、;而包装类型通常是使用集合时使用。

总结

通过上述分析,基本数据类型和包装类型的具体使用场景不同,它们之间可以起到一个相互补充的作用,丰富了数据类型的操作,所以基本数据类型和包装类型在java中都是很重要的。

其他推荐