Java教程

Java包装类(直戳本质)

本文主要是介绍Java包装类(直戳本质),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

为什么需要包装类

        JAVA是面向对象的语言,很多类和方法中的参数都需要使用对象(例如:集合),但基本类型数据却不是面向对象的,造成了很多不便。

        包装类,顾名思义,是将基本类型"包装起来",使其具备对象的特质,包括可以添加属性和方法,位于 java . lang包下。

装箱and拆箱:

        拆箱和装箱

        将基本数据类型转化为对应类型的包装类的过程叫"装箱";

        将包装类转为对应类型的基本数据类型的过程叫做"拆箱"。

public static void main(String[] args) {    
    Integer a = 0;    
    for(int i = 0; i < 100; i++){        
        a += i;    
    } 
}

上面中给变量a赋值的时候发生了装箱,而在参与计算的过程中就发生了拆箱,但是又好像什么也没做,这是自动拆箱。

装箱过程AND拆箱过程

 int num1 = 25;
    Integer i = Integer.valueOf(num1);//装箱
    
    Integer j = 10;
    int num2 = j.intValue();    //拆箱

装箱是通过调用包装器类的 valueOf 方法实现的

拆箱是通过调用包装器类的 xxxvalueOf 方法实现的,xxx代表对应的基本数据类型。例如: int 装箱的时候自动调用IntegervalueOf(int)方法; Integer 拆箱的时候自动调用IntegerintValue方法。

自动装箱 AND自动拆箱

Java 为了简便拆箱与装箱的操作,提供了自动拆装箱的功能

    int t1 = 2;
    Integer t2 = t1;//自动装箱
    
    int t3 = t2;//自动拆箱

自动装箱都是通过包装类的valueOf()方法来实现的.自动拆箱都是通过包装类对象的xxxValue()来实现的。

什么时候会自动拆装箱(示例代码中解释了装箱或者拆箱的过程)

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

    List<Integer> li = new ArrayList<>();
    for (int i = ; i < 50; i ++){
        li.add(i);
    
    
    List<Integer> li = new ArrayList<>();
    for (int i = 1; i < 50; i += 2){
        li.add(Integer.valueOf(i));
    }

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

    Integer a=1;
    System.out.println(a==1?"等于":"不等于");
    Boolean bool=false;
    System.out.println(bool?"真":"假")
    
    
    Integer a=1;
    System.out.println(a.intValue()==1?"等于":"不等于");
    Boolean bool=false;
    System.out.println(bool.booleanValue?"真":"假");

  3. 包装类型的运算

    Integer 四则运算

    Integer i = 10;
    Integer j = 20;
    System.out.println(i+j)
    ​
    Integer i = Integer.valueOf(10);
    Integer j = Integer.valueOf(20);
    System.out.println(i.intValue() + j.intValue());

  4. 三目运算符的使用

     boolean flag = true;
     Integer i = 0;
     int j = 1;
     int k = flag ? i : j;
    
     boolean flag = true;
     Integer i = Integer.valueOf(0);
     int j = 1;
     int k = flag ? i.intValue() : j;
    

  5. 函数参数与返回值

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

    自动拆箱与缓存

    Integer integer1 = 3;
    Integer integer2 = 3;
    System.out.println(integer1 == integer2);//ture 
    
    
    Integer integer3 = 300;
    Integer integer4 = 300;
    System.out.println(integer3 == integer4);//false

在Java中,==比较的是对象应用。但是在这个例子中,真正的结果是ture,false。

原因就和 Integer中的缓存机制有关。在Integer的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。

    适用于整数值区间-128 至 +127。
​
    只适用于自动装箱。使用构造函数创建对象不适用。

当需要进行自动装箱时,如果数字在-128至127之间时,会直接使用缓存中的对象,而不是重新创建一个对象。

包装类

用途:

  1. 集合不允许存放基本数据类型,故常用包装类。

  2. 包含了每种基本类型的相关属性,例如:最大值,最小值,所占位数等。

  3. 作为基本数据类型对应的类的类型,提供了一系列实用的对象操作,例如:类型转换,进制转换等。

基本类型与包装类型的区别:

  1. 八大基本类型不是对象。

  2. 声明方式的不同。基本类型无需用new关键字来创建,封装类却需要用new关键字创建。

  3. 存储方式及位置的不同。基本类型是直接存储变量的值保存在堆栈中能高效的存取,包装类需要通过引用指向实例,具体的实例保存在堆中。

  4. 初始值的不同。包装类型的初始值为null,基本类型的初始值是具体的类型而定的,例如: int 初始值为0,boolean 为false

  5. 使用的方式不同。例如: 与集合类合作使用时只能使用包装类型。

  6. 什么时候改用包装类,什么时候用基本类型,看基本的业务来定:这字段允许null值,就需要用包装类型;如果不允许null,使用基本类型就可以;用到泛型和反射用函数,就需要用包装类。

        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);
        System.out.println(i == i2); 
        //Integer会自动拆箱为int,所以为true
        System.out.println(i == i3); 
        //true,理由同上
        
        Integer i4 = 127;
        //编译时被翻译成:Integer i4 = Integer.valueOf(127);
        Integer i5 = 127;
        System.out.println(i4 == i5);
        //true  缓存(-128-127)在范围内,true
        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println(i6 == i7);
        //false 缓存(-128-127)不在范围内,false
        Integer i8 = new Integer(127);
        System.out.println(i5 == i8); 
        //false 地址不同
        Integer i9 = new Integer(128);
        Integer i10 = new Integer(123);
        System.out.println(i9 == i10);  
        //false

总结:

  1. 无论如何,Integer 与 new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(方法区),他们的内存地址是不一样的,所有为false。

  2. 两个都是非new出来的Integer ,如果数在-128-127之间,为true,否则为false。

  3. 两个new出来的,都为false。内存地址不一样。

  4. int和Integer(无论new不new)比,都为true,因为会把Integer自动拆箱成int去比。

基本类型的包装类

Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail

BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算。

BigInteger支持任意精度的整数,BigDecimal支持任意精度带小数点的运算。

这篇关于Java包装类(直戳本质)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!