【Java基础】自动拆装箱

目录

基本数据类型

八大数据类型

Java类型分类

        基本类型:

        引用类型:

void类型

使用基本数据类型的好处

包装类型

创建对象方法

Byte

Boolean

Short

Character

Integer

Long

Float

Double

为什么需要包装类

装箱与拆箱

装箱与拆箱

        装箱:

        拆箱:

自动拆装箱

        自动装箱:

        自动拆箱:

自动拆装箱的实现原理

自动拆装箱使用场景

        1.将基本类型放入集合类

        2.包装类型和基本类型比较大小

        3.包装类型的运算

        4.三目运算符的使用

        5.函数参数与返回值

自动拆装箱与缓存

 自动拆装箱带来的问题


基本数据类型

八大数据类型

字符型                                                        char

布尔类型                                                     boolean

整数类型                                                     byte、short、int、long

浮点数类型                                                  float、double

Java类型分类

        基本类型:

                在JVM栈中分配空间存值

        引用类型:

                在堆中分配空间存值

void类型

Java还存在一种基本类型void,对应的包装类为java.lang.Void,Void是不能被new出来的

【Java基础】自动拆装箱_第1张图片

因此不能在堆中分配存储空间存储对应的值

使用基本数据类型的好处

在Jva语言中,new一个对象是存储在堆中的,我们通过栈中的引用来使用这些对象,是比较费资源的

而常用的基本数据类型,不需要用new创建,数据直接存放在栈中,所以会更加高效

 我们可以知道,在栈中每一个栈帧,都包含了局部变量表,这里局部变量中的数据,就是存储在局部变量表中的

【Java基础】自动拆装箱_第2张图片

包装类型

基本数据类型 包装类
byte Byte
boolean Boolean
short Short
char Character
int Integer
long Long
float Float
double Double

创建对象方法

Byte

public class Test04 {
    public static void main(String[] args) {
        Byte a = 2;                                    //通过自动装箱赋值
        Byte b = new Byte(String.valueOf(1));         //通过String创建对象
    }
}

Boolean

public class Test04 {
    public static void main(String[] args) {
        Boolean a = true;          //通过valueOf赋值
        Boolean c = new Boolean(String.valueOf(true));          //通过String
        Boolean b = new Boolean(true);                 //通过常数
    }
}

Short

public class Test04 {
    public static void main(String[] args) {
        Short a = 1;                                    //通过自动装箱赋值
        Short b = new Short(String.valueOf(1));         //通过String创建对象
    }
}

Character

public class Test04 {
    public static void main(String[] args) {
        Character a = '1';          //通过valueOf赋值
        Character b = new Character('1');                 //通过常数
    }
}

Integer

public class Test04 {
    public static void main(String[] args) {
        Integer a = 2;                                    //通过自动装箱赋值
        Integer b = new Integer(1);                 //通过常数
        Integer c = new Integer(String.valueOf(1));       //通过String创建对象
    }
}

Long

public class Test04 {
    public static void main(String[] args) {
        Long a = Long.valueOf(2);                   //通过valueOf赋值
        Long b = new Long(1);                 //通过常数
        Long c = new Long(String.valueOf(1));       //通过String创建对象
    }
}

Float

public class Test04 {
    public static void main(String[] args) {
        Float a = Float.valueOf((float) 2.1);          //通过valueOf赋值
        Float b = new Float(1.5);                 //通过常数
        Float c = new Float(String.valueOf(1));       //通过String创建对象
    }
}

Double

public class Test04 {
    public static void main(String[] args) {
        Double a = Double.valueOf((Double) 2.1);          //通过valueOf赋值
        Double b = new Double(1.5);                 //通过常数
        Double c = new Double(String.valueOf(1));       //通过String创建对象
    }
}

为什么需要包装类

Java是面向对象的语言,很多地方都是需要使用对象而不是剧本数据类型的

        比如在集合类中,我们无法将int等数据类型放进去,因为集合的容器要求元素是Object类型

为了让基本类型也具有对象特性,就出现了包装类型,丰富了基本类型的操作

装箱与拆箱

装箱与拆箱

        装箱:

                把基本类型转换为包装类的过程就是装箱

        拆箱:

                把包装类转换为基本数据类型就是拆箱

自动拆装箱

在JavaSE5中,为了减少开发人员的工作,Java提供了自动拆装箱功能

        自动装箱:

                将基本数据类型自动转化为对应的包装类

        自动拆箱:

                将包装类自动转化成对应的基本数据类型

自动拆装箱的实现原理

        自动装箱都是通过包装类的valueOf方法实现的

        自动装箱都是通过包装类对象xxxValue方法实现的(如intValue)

自动拆装箱使用场景

        1.将基本类型放入集合类

                集合类中都是对象类型,但是我们add(基本数据类型)也不会报错,是因为Java给我们做了自动装箱

        2.包装类型和基本类型比较大小

                包装类与基本数据类型进行比较运算,先将包装类进行拆箱成基本数据类型,然后比较

        3.包装类型的运算

                对两个包装类型进行运算,会将包装类型自动拆箱为基本类型进行

        4.三目运算符的使用

                如

falg?i:j

        5.函数参数与返回值

//自动拆箱
public int getNum1(Integer num) {
 return num;
}
//自动装箱
public Integer getNum2(int num) {
 return num;
}

自动拆装箱与缓存

在Java SE5中,Integer操作引入了新功能来节省内存和提高性能

        1.适用于整数区间-128~+127

        2.只适用于自动装箱,使用构造函数创建对象不适用

        3.只适用于整形,浮点型不行

public class Test04 {
    public static void main(String[] args) {
        //不创建对象且在-128~127中
        Integer a = 1;
        Integer b = 1;
        System.out.println(a == b);        //true
        //创建对象且在-128~127中
        Integer c = new Integer(1);
        Integer d = new Integer(1);
        System.out.println(c == d);        //fasle
        //不创建对象且不在-128~127中
        Integer e = 200;
        Integer f = 200;
        System.out.println(e == f);        //false
    }
}

 自动拆装箱带来的问题

        1.包装对象之间的数值比较不能简单的使用==,除了特殊情况(如Integer的-128~127),其他比较都需要使用equals比较

        2.如果包装类对象为NULL,那么自动拆箱就可能会抛出NPE

        3.如果一个for循环中有大量拆装箱操作,会浪费很多资源

参考文章

什么是Java中的自动拆装箱_HelloWorld搬运工-CSDN博客_java自动拆装箱

Java 中基本数据类型是 8 种还是 9 种? Void 的解释._话流年的博客-CSDN博客_void是不是基本数据类型

你可能感兴趣的:(Java基础,java,开发语言,后端)