day007 集合【迭代器、增强for、泛型】

1 Collection接口方法

day007 集合【迭代器、增强for、泛型】

2 迭代器Iterator

如何对集合进行遍历?

之前都是通过索引的方式进行遍历,但是这种方式并不适用于所有的集合。

因为有些集合没有索引。

 

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

 

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

 

如何才能获取到一个集合的迭代器呢??

可以通过Collection里面的方法

Iterator<E> 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>  这个E就是一个泛型,他是一种不确定的数据类型,必须等到使用这个类(创建对象)的时候才能确定这个类型到底是啥

 

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

 

泛型的好处:

 1. 省略了强转的代码,让代码看起来更加的简洁。

 2. 把运行时异常提前到编译时期。

3.1 伪泛型(泛型擦除)

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

3.2 泛型的定义与使用

3.3.1 含有泛型的类

定义格式:修饰符 class 类名<代表泛型的变量> {  }

使用格式:创建对象时,确定泛型的类型

3.3.2 含有泛型的方法

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

使用格式:调用方法时,确定泛型的类型

3.3.3 含有泛型的接口

定义格式:修饰符 interface接口名<代表泛型的变量> {  }

使用格式:

1. 实现类实现这个接口的时候,直接把这个泛型确定出来。

2. 实现类在实现接口的时候不确定泛型,把泛型继承下来,等到使用这个实现类对象的时候,再确定这个泛型。

3.3 泛型通配符

 

注意:

泛型之间是没有继承关系的。

ArrayList<Person> 不是ArrayList<Student> 的父类

如果想要在方法参数位置匹配任意类型的泛型,可以使用泛型通配符。

3.3.1 泛型通配符的使用

?: 可以表示任意类型的泛型。

 

注意:泛型通配符只能被动接收,不能主动使用。

 

3.3.2 泛型限定:

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

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

 

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

 

 

相关文章: