25 集合Collection,迭代器Iterator,泛型
集合
之前我们学过ArrayList<E>,集合是Java存储多个数据的容器,比较数组有以下不同点
数组固定长度,集合可变
数组可以存储基本类型和对象,集合只能存储对象
Collection集合框架
接口Collection位与java.util包,需要导包
1
什么都不说先来一张图好好看看
Java的集合框架继承关系如上,Collection是总的父接口,然后List,Set分别为其特性子接口,然后每个接口还有对象的实现子类,如我们知道的ArrayList。我们学习集合的目标是知道使用集合存储数据,会遍历集合,掌握每个集合的特性。图中也简介了List,Set分别的特性,List有序,可使用索引,允许重复元素,for遍历。Set无序,不能通过索引for遍历,其中LinkedHashSet是特殊的,其有序
2
如上图,可以看见集合框架的基本关系和特性,底层实现
Collection方法
3
如上图,Collection接口有如上方法,那么实现子类也有,我们一一调用下
4
如上,分别调用了如上的方法,其中使用多态的写法
Iteration迭代器
迭代就是从集合逐个取出全部元素的实现
java.util.Iteration迭代器接口,常用方法
next()获得下一个元素
hasNext()判断集合是否还有元素,返回boolean值
Iteration本身无法实例化,Collection.iterator()返回的就是其实现类
步骤1:使用Collection.iterator()返回实现类,用Iterator接口接收,这是多态写方法
2用hasNext()判断是否还有元素
3使用next()获取元素
5
Iteration底层原理是,实例化接口对于ArrayList是指向不存在的索引-1,然后每次next加1判断,
增强for循环
for(元素类型 变量名:数组或者Collection集合){..}使用
这里不care索引,直接使用元素遍历,所以适合接口基类Collection,是jdk1.5以后出现的方法,intelliJ输入foreach即可弹出快捷创建
6
泛型
泛型是一种未知的数据类型,我们不知道使用什么类型时,使用泛型,如ArrayList<E>中尖括号不指定包装类就默认使用Object对象,add(E e)方法定义也是使用泛型,不知道添加的是什么类型,这个E可以使用其他大写字母代替
当我们创建了集合类型后,就可以指定类型了ArrayList<Integer> a = new ArrayList<>();
不使用泛型,声明集合,那么集合什么类型都可以存储,但是会不安全,因为数据类型不固定
7
如上,我们给集合a里塞了整数,字符串,浮点数,因为我们没有加指定类型,存放Object对象即可
但是如果我们遍历元素想要使用字符串方法,整数和浮点数明显就会报错,因为无法直接转型
8
我们指定泛型,集合只能存储一种类型,而且编译时就会报错,如上
自定义含有泛型的类
我们之前定义Person类,Student类再熟悉不过了,可以定义getter,setter方法,下面我们定义泛型属性,使用泛型,就是在类名称后面加上<E>,然后里面的对应类型使用E即可,如下
9
10
如上,我们定义了getter,setter但是并没有限制其类型,但是随着我们实例化限制,设置和获取只能得到对应类型
定义使用泛型的方法
格式 修饰符 <泛型> 返回值类型 函数名(含有泛型的参数列表){..}
11
12
如上
含有泛型的接口
定义和含有泛型类一样,重点是实现类有2种写法,1是继承时指定类型,然后实例只能使用这种类型,另一种是继承也使用泛型,知道实例使用对应类型
继承指定类型
13
14
15
如上,我们定义接口,使用泛型,然后实现了继承传入指定类型字符串,我们使用方法时,ide也会自动给我们设定泛型类型为字符串,当然我们实例就只能传字符串
16
这样使用的如Scanner,是继承Iterator指定String类型的
继承继续使用泛型
17
如上,继承继续使用泛型,本质上就是相当于定义一个泛型的类,格式如上,
18
我们可以在其实例时传入指定类型,然后对应方法使用对应参数
泛型通配符
19
如上,我们定义了ArrayList的2个实例集合,一个存整数,一个字符串,我们定义一个方法,传入的是集合,然后进行遍历,如上,我们指定集合类型是字符串时,list1会报错,如果我们指定Integer,list2又会报错
20
如上,我们可以使用通配符?来代替类型位置,就不会报错,泛型通配符是不能再实例使用的,如
21
泛型受限类型
上限<? extends A> 只能是A或者A的子类
下限<? super A> 只能是A或者A的父类
22
如上,我们知道Integer继承于Number,Number又继承于Object,而extends Number,只有a,b满足,super Integer只有a,b,c满足
案例斗地主发牌
23
没什么好说的,就是发牌处理好花色,这里使用Collection.shuffle进行打乱,我开始以为是Random下的,结果不是,这里用了2次嵌套,而且注意的是ArrayList虽然有索引,但是不是使用[index]模式,而是使用set,get方法