4.1.1java包装类

 在 Java 里,基本数据类型不具备对象的特性,像不能调用方法、参与面向对象的操作等。为了让基本数据类型也能有对象的行为,Java 提供了对应的包装类。同时,自动拆箱和自动装箱机制让基本数据类型和包装类之间的转换更加便捷。

包装类概述

Java 为 8 种基本数据类型都提供了对应的包装类,具体如下:

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

包装类属于引用类型,继承自 Object 类,具备对象的特性,能调用方法和参与面向对象的操作。

包装类的用途

  • 作为泛型的类型参数:泛型只能使用引用类型,不能使用基本数据类型,这时就需要用到包装类。例如:
import java.util.ArrayList;
import java.util.List;

public class WrapperClassGenericExample {
    public static void main(String[] args) {
        // 正确,使用包装类作为泛型类型参数
        List<Integer> intList = new ArrayList<>();
        intList.add(1);
        // 错误,不能使用基本数据类型作为泛型类型参数
        // List<int> wrongList = new ArrayList<>(); 
    }
}

  • 包含实用方法:包装类提供了一些实用的方法,像类型转换、进制转换等。例如:
public class WrapperClassMethodExample {
    public static void main(String[] args) {
        String str = "123";
        // 将字符串转换为整数
        int num = Integer.parseInt(str); 
        System.out.println(num);

        int decimal = 255;
        // 将十进制数转换为十六进制字符串
        String hex = Integer.toHexString(decimal); 
        System.out.println(hex);
    }
}

自动装箱和自动拆箱

自动装箱

自动装箱指的是把基本数据类型自动转换为对应的包装类对象。在 Java 5 之后引入了自动装箱机制,让代码更简洁。例如:

public class AutoBoxingExample {
    public static void main(String[] args) {
        int num = 10;
        // 自动装箱,将 int 类型的 num 转换为 Integer 类型的 obj
        Integer obj = num; 
        System.out.println(obj);
    }
}
自动拆箱

自动拆箱是把包装类对象自动转换为对应的基本数据类型。例如:

public class AutoUnboxingExample {
    public static void main(String[] args) {
        Integer obj = 20;
        // 自动拆箱,将 Integer 类型的 obj 转换为 int 类型的 num
        int num = obj; 
        System.out.println(num);
    }
}
自动装箱和拆箱的实现原理

自动装箱和拆箱是通过编译器在编译阶段自动插入相应的方法调用实现的。具体来说,自动装箱调用的是包装类的 valueOf() 方法,自动拆箱调用的是包装类的 xxxValue() 方法(xxx 代表基本数据类型)。例如:

public class AutoBoxingUnboxingPrinciple {
    public static void main(String[] args) {
        // 自动装箱,实际调用 Integer.valueOf(30)
        Integer obj = 30; 
        // 自动拆箱,实际调用 obj.intValue()
        int num = obj; 
    }
}
注意事项
  • 缓存问题:部分包装类(如 IntegerByteShortLongCharacter)会对一定范围内的值进行缓存,以提高性能。例如,Integer 类会缓存 -128 到 127 之间的值,当使用自动装箱创建这个范围内的 Integer 对象时,会直接从缓存中获取,而不是创建新对象。示例如下:
public class WrapperClassCacheExample {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        // 输出 true,因为 100 在缓存范围内,a 和 b 引用同一个对象
        System.out.println(a == b); 

        Integer c = 200;
        Integer d = 200;
        // 输出 false,因为 200 不在缓存范围内,c 和 d 是不同的对象
        System.out.println(c == d); 
    }
}

  • 空指针异常:在进行自动拆箱时,如果包装类对象为 null,会抛出 NullPointerException 异常。例如:
public class NullPointerInAutoUnboxing {
    public static void main(String[] args) {
        Integer obj = null;
        // 会抛出 NullPointerException 异常
        int num = obj; 
    }
}

通过使用包装类、自动装箱和自动拆箱机制,Java 让基本数据类型和对象之间的交互更加灵活和方便。不过在使用过程中,要注意缓存问题和空指针异常等潜在风险

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    chxii

    小小打赏,大大鼓励!

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值