集合体系结构.jpg

1 Collection接口方法

QQ拼音截图未命名.png

2 迭代器Iterator

如何对集合进行遍历?
之前都是通过索引的方式进行遍历,但是这种方式并不适用于所有的集合。
因为有些集合没有索引。

有一种通用的遍历方式,叫做迭代器遍历,可以遍历所有的集合。

迭代器就是一个遍历集合的工具,你可以把它看成一个光标(指针),这个光标最开始指向集合的最开头。

如何才能获取到一个集合的迭代器呢??
可以通过Collection里面的方法
Iterator iterator():获取当前集合的迭代器。

如果要通过迭代器进行遍历,又需要用到迭代器里面的两个方法
boolean hasNext(): 判断是否还有没有元素可以获取,如果还有元素可以获取那么返回的就是true。
E next(): 拿到当前的元素,然后把光标向后移动一个位置

迭代器遍历具体的步骤:
1. 拿到这个集合的迭代器。
2. 判断是否还有元素可以获取。
3. 如果还有元素可以获取,那么就调用next方法获取元素并把光标后移。

2.1 并发修改异常

java.util.ConcurrentModificationException叫做并发修改异常。

当使用迭代器遍历集合的时候,如果往集合中添加元素,就会引发并发修改异常。
不仅添加会引发,只要遍历的时候对集合的长度进行改变(包括添加或删除),就会引发并发修改异常

注意:
一定要使用集合的方法去添加或者删除才会引发并发修改异常。

并发修改异常是由next方法引发的。

2.2 增强for循环

JDK1.5 之后,又多了一种遍历方式,叫做增强for循环,语法更简洁。

格式:
for(数据类型 变量名 : 容器名) {
//….
}
解释:
数据类型: 容器中保存的数据是什么类型,这个数据类型就写什么。
变量名: 这个表示的是容器中的每一个元素。
容器名:这个容器可以是集合也可以是数组。 JDK规定,只要实现了Iterable接口,都可以进行增强for循环。

好处:省略了索引的操作,更加简便。
缺点: 不能获取到索引。如果需要使用索引的话,还需要使用普通for循环。

使用增强for遍历数组,本质还是普通for循环。增强for只是一个语法糖的优化。

增强for循环和老式的for循环有什么区别?
注意:新for循环必须有被遍历的目标。目标只能是Collection或者是数组。
建议:遍历数组时,如果仅为遍历,可以使用增强for如果要对数组的元素进行操作,使用老式for循环可以通过角标操作。

如果使用增强for循环遍历集合,本质其实就是使用迭代器进行遍历。

3 泛型

泛型就是一种未知的,不确定的数据类型。
比如:ArrayList 这个E就是一个泛型,他是一种不确定的数据类型,必须等到使用这个类(创建对象)的时候才能确定这个类型到底是啥

泛型是可以省略的,如果省略泛型,那么泛型默认是Object类型。

泛型的好处:
1. 省略了强转的代码,让代码看起来更加的简洁。
2. 把运行时异常提前到编译时期。

3.1 伪泛型(泛型擦除)

  1. java中的泛型是伪泛型,只在编译时期有效,一旦到了运行时期,这个泛型就会消失。俗称泛型擦除。

3.2 泛型的定义与使用

3.3.1 含有泛型的类

定义格式:修饰符 class 类名<代表泛型的变量> { }
使用格式:创建对象时,确定泛型的类型

3.3.2 含有泛型的方法

定义格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
使用格式:调用方法时,确定泛型的类型

3.3.3 含有泛型的接口

定义格式:修饰符 interface接口名<代表泛型的变量> { }
使用格式:
1. 实现类实现这个接口的时候,直接把这个泛型确定出来。
2. 实现类在实现接口的时候不确定泛型,把泛型继承下来,等到使用这个实现类对象的时候,再确定这个泛型。

3.3 泛型通配符

注意:
泛型之间是没有继承关系的。
ArrayList 不是ArrayList 的父类
如果想要在方法参数位置匹配任意类型的泛型,可以使用泛型通配符。

3.3.1 泛型通配符的使用

?: 可以表示任意类型的泛型。<br /> <br />    注意:泛型通配符只能被动接收,不能主动使用。

3.3.2 泛型限定:

<? extends A>:泛型的类型必须是A或者A的子类。 上限, 最高到A类。
<? super A>: 泛型的类型必须是A或者A的父类。 下限, 最低到A类。

泛型作用:一般用于后期的代码重构