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

    科技2022-08-01  100

    1 Collection接口方法

    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类。

     

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

     

     

    Processed: 0.012, SQL: 8