25 集合Collection,迭代器Iterator,泛型

2020-03-07  本文已影响0人  ca8519be679b

集合

之前我们学过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方法

上一篇 下一篇

猜你喜欢

热点阅读