【数据结构】包装类和泛型

发布于:2025-04-14 ⋅ 阅读:(34) ⋅ 点赞:(0)


泛型的学习,最重要的是:
知道 泛型的对象是怎么实例化的,关键目的是为了使用 后续的集合类

MyClass<String> obj = new MyClass<>();//泛型类的实例化

一、 包装类

1.1 基本数据类型(8个)和对应的包装类

  1. Java 提供了 8个 基本数据:byte,short,int,long,float,double,char,boolean。
    为了和C语言兼容,引入的一些概念。
  2. 包装类:Java把这些基本类型,都搞一个类,进行包装。把基础类型通过类进一步的封装,叫做包装类。
基本数据类型 对应的包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
  1. 后续可以给包装类中提供一些方法,完成一些相关操作。
    比如:使包装类和内置类型之间,相互转换的方法(装箱和拆箱)。

1.2 装箱和拆箱

在这里插入图片描述

1.3 自动装箱和自动拆箱

(1)在使⽤过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,
java 提供了⾃动机制。
在这里插入图片描述

(2)所有的包装类和对应的内置类型都支持这样的操作。

  1. 装箱:内置类型 转换为 包装类
int i = 10;
Integer ii = i; // ⾃动装箱
Integer ij = (Integer)i; // ⾃动装箱,,加上了手动的类型转换

  1. 拆箱: 包装类 ==> 内置类型
int j = ii; // ⾃动拆箱
int k = (int)ii; // ⾃动拆箱,加上了手动的类型转换
  1. 包装类的比较
public class Demo2 {
    public static void main(String[] args) {
        Integer a = 127;
        Integer b = 127;

        Integer c = 128;
        Integer d = 128;

        System.out.println(a == b);
        System.out.println(c == d);
    }
}

在这里插入图片描述

为什么出现这样的结果?

(1)a和b的比较:true

在这里插入图片描述

(2)c和d的比较:false

在这里插入图片描述

二、 泛型

2.1 泛型的作用

  • 在Java这样的语言中,写一个类 / 方法,往往都需要说明里面的成员 / 参数的类型。
  • 但是也有些情况,程序员希望一个类 / 方法,能够同时给 不同类型 提供支持。

比如,写一个add方法,实现两个数相加(两个 int / double / Integer / 数组 类型相加):
前面学习过的方法重载就可以提供这样的支持,但是重载出来的多个方法,代码都差不多,这样的写法比较麻烦。

  • 因此,引入泛型。写一份代码,就可以同时支持多种类型,提高代码的通用性。
  • 日常开发中,很少直接使用泛型;更多的是基础库,基础框架中,广泛得使用泛型。

2.2 为什么需要泛型?

实现⼀个类,类中包含⼀个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员⽅法返回数组中某个下标的值?

思路

  1. 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new String[10];
  2. 所有类的⽗类,默认为Object类。数组是否可以创建为Object?

代码实现:

在这里插入图片描述

问题:以上代码实现后,发现:

  • 任何类型数据都可以存放
  • 1号下标本⾝就是字符串,但是确编译报错。必须进⾏强制类型转换
  • 虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有⼀种数据类型。而不是同时持有这么多类型。

使用泛型的优点:

  • 代码复用,一份代码,支持多种类型。
  • 自动的进行类型转换,编译过程中也会触发一些类型检查。
    在这里插入图片描述

2.3 泛型语法

  1. 泛型语法
    在这里插入图片描述
  2. 泛型 实例

(1)泛型类定义 实例1:
在这里插入图片描述
(2)实例 2:

class MyArray<T>{//泛型类的定义
    //private T[] arr = new T[10];//err
    //T 当前能表示任何类型,new T[] 的时候,就可能会涉及到调用该类的构造方法
    //而T是什么类型还不知道,无法调用构造方法!
    // 所以不能写成new T[10]:需要new Object[] 转成 T[]
    private T[] arr = (T[])new Object[10];

    public  T get(int index){
        return arr[index];
    }

    public void set(int index,T value){
        arr[index] = value;
    }
}

public class Demo3 {
    public static void main(String[] args) {
        MyArray<String> arr = new MyArray<>();//泛型类的实例化

        MyArray<Integer> arr2 = new MyArray<>();
        
        //MyArray<int> arr3 = new MyArray<>();//err
        //泛型,在Java底层,是当做“Object”来处理的,int类型当做Object类处理
    }
}

【泛型语法规则总结】

(1)泛型类的定义(很少会写到)
在这里插入图片描述
(2)泛型类的实例化(经常会用到)
在这里插入图片描述

Java的各种集合类:ArrayList、HashMap都是泛型的,可以保存 String
也可以保存Integer,也可以保存我们自己写的类的对象。


网站公告

今日签到

点亮在社区的每一天
去签到