• 数据结构 | (一)包装类和初始泛型


    包装类
    Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型。
    基本数据类型包装类
    byte

    Byte

    shortShort
    intInteger
    long

    Long

    floatFloat
    doubleDouble
    charCharacter
    booleanBoolean
    除了 Integer Character , 其余基本类型的包装类都是首字母大写。
    装箱和拆箱

    装箱(Boxing)和拆箱(Unboxing)是Java中用于基本数据类型和对应包装类之间转换的过程。

    装箱是将基本数据类型转换为对应的包装类对象。例如,将int类型的值转换为Integer对象。装箱可以通过自动装箱(Autoboxing)或手动装箱(Manual Boxing)来完成。

    自动装箱是指在需要使用包装类对象的地方,直接使用基本数据类型,编译器会自动将其转换为对应的包装类对象。例如:

    1. int num = 10;
    2. Integer obj = num; // 自动装箱


    手动装箱是通过调用包装类的构造方法,将基本数据类型转换为对应的包装类对象。例如:

    1. int num = 10;
    2. Integer obj = new Integer(num); // 手动装箱


    拆箱是将包装类对象转换为对应的基本数据类型。例如,将Integer对象转换为int类型的值。拆箱可以通过自动拆箱(Autounboxing)或手动拆箱(Manual Unboxing)来完成。

    自动拆箱是指在需要使用基本数据类型的地方,直接使用包装类对象,编译器会自动将其转换为对应的基本数据类型的值。例如:

    1. Integer obj = 10;
    2. int num = obj; // 自动拆箱


    手动拆箱是通过调用包装类的方法,将包装类对象转换为对应的基本数据类型的值。例如:

    1. Integer obj = new Integer(10);
    2. int num = obj.intValue(); // 手动拆箱


    装箱和拆箱提供了基本数据类型和包装类之间的相互转换,使得在需要使用对象的场景中也可以使用基本数据类型,并且可以方便地进行类型转换。

    1. public static void main(String[] args) {
    2. Integer a = 127;
    3. Integer b = 127;
    4. Integer c = 128;
    5. Integer d = 128;
    6. System.out.println(a == b); //true
    7. System.out.println(c == d); //false
    8. }

    在Java中,对于Integer类型的对象,当其值在-128到127之间时,会使用对象池(Integer Cache)来缓存这些值,以提高性能和节省内存。这意味着当我们创建一个值在-128到127之间的Integer对象时,如果对象池中已经存在相同值的对象,那么将直接返回这个对象的引用,而不是创建一个新的对象。

    所以,在你的代码中,a和b的值都是127,它们在对象池中已经存在了一个相同值的对象,所以a和b实际上指向的是同一个对象,因此a == b返回true。

    而对于c和d的值,它们都是128,超过了对象池的范围,所以每次创建一个新的对象来存储这个值。因此,c和d实际上是两个不同的对象,即使它们的值相同,所以c == d返回false。

    泛型
    1. class 泛型类名称<类型形参列表> {
    2. // 这里可以使用类型参数
    3. }
    4. class ClassName {
    5. }
    1. class 泛型类名称<类型形参列表> extends 继承类/* 这里可以使用类型参数 */ {
    2. // 这里可以使用类型参数
    3. }
    4. class ClassName extends ParentClass {
    5. // 可以只使用部分类型参数
    6. }
    1. 泛型类<类型实参> 变量名; // 定义一个泛型类引用
    2. new 泛型类<类型实参>(构造方法实参); // 实例化一个泛型类对象
    注意:泛型只能接受类,所有的基本数据类型必须使用包装类!
    泛型如何编译的
    擦除机制 : 在编译的过程当中,将所有的 T 替换为 Object 这种机制,我们称为: 擦除机制
    1. T[] ts = new T[5] //错误写法
    2. //在Java中,泛型类型参数在编译期间会被擦除为它们的上界(或者Object类型,如果没有指定上界)。
    3. //因此,T[] ts = new T[5]是不合法的,因为编译器无法确定T的具体类型。
    4. //正确写法
    5. Object[] ts = new Object[5];
    6. T[] result = (T[]) ts;
    在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
    1. class 泛型类名称<类型形参 extends 类型边界> {
    2. ...
    3. }
    1. public class MyArrayextends Number> {
    2. ...
    3. }
    4. 只接受 Number 的子类型作为 E 的类型实参
    5. MyArray l1; // 正常,因为 Integer 是 Number 的子类型
    6. MyArray l2; // 编译错误,因为 String 不是 Number 的子类型
    泛型方法
    定义语法
    方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }
    示例
    1. public class Util {
    2. //静态的泛型方法 需要在static后用<>声明泛型类型参数
    3. public static void swap(E[] array, int i, int j) {
    4. E t = array[i];
    5. array[i] = array[j];
    6. array[j] = t;
    7. }
    8. }

  • 相关阅读:
    设计模式:适配器模式
    kong网关部署
    array.some()详解
    python venv在linux上激活环境无效,没反应
    [论文笔记] Mistral论文解读
    【蓝桥杯物联网赛项学习日志】Day4 关于USART/UART
    通过redis学网络(1)-用go基于epoll实现最简单网络通信框架
    【设计模式】观察者模式
    LeetCode 88. 合并两个有序数组
    【Java实战】工作中并发处理规范
  • 原文地址:https://blog.csdn.net/khh1014173041/article/details/133677600