【数据结构】包装类和泛型
泛型的学习,最重要的是:
知道 泛型的对象是怎么实例化的,关键目的是为了使用 后续的集合类
MyClass<String> obj = new MyClass<>();//泛型类的实例化
一、 包装类
1.1 基本数据类型(8个)和对应的包装类
- Java 提供了 8个 基本数据:byte,short,int,long,float,double,char,boolean。
为了和C语言兼容,引入的一些概念。 - 包装类:Java把这些基本类型,都搞一个类,进行包装。把基础类型通过类进一步的封装,叫做包装类。
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
- 后续可以给包装类中提供一些方法,完成一些相关操作。
比如:使包装类和内置类型之间,相互转换的方法(装箱和拆箱)。
1.2 装箱和拆箱
1.3 自动装箱和自动拆箱
(1)在使⽤过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,
java 提供了⾃动机制。
(2)所有的包装类和对应的内置类型都支持这样的操作。
- 装箱:内置类型 转换为 包装类
int i = 10;
Integer ii = i; // ⾃动装箱
Integer ij = (Integer)i; // ⾃动装箱,,加上了手动的类型转换
- 拆箱: 包装类 ==> 内置类型
int j = ii; // ⾃动拆箱
int k = (int)ii; // ⾃动拆箱,加上了手动的类型转换
- 包装类的比较
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 为什么需要泛型?
实现⼀个类,类中包含⼀个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员⽅法返回数组中某个下标的值?
思路:
- 我们以前学过的数组,只能存放指定类型的元素,例如:int[] array = new int[10]; String[] strs = new String[10];
- 所有类的⽗类,默认为Object类。数组是否可以创建为Object?
代码实现:
问题:以上代码实现后,发现:
- 任何类型数据都可以存放
- 1号下标本⾝就是字符串,但是确编译报错。必须进⾏强制类型转换
- 虽然在这种情况下,当前数组任何数据都可以存放,但是,更多情况下,我们还是希望他只能够持有⼀种数据类型。而不是同时持有这么多类型。
使用泛型的优点:
- 代码复用,一份代码,支持多种类型。
- 自动的进行类型转换,编译过程中也会触发一些类型检查。
2.3 泛型语法
- 泛型语法
- 泛型 实例
(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,也可以保存我们自己写的类的对象。