1 Collection接口方法
2 迭代器Iterator
如何对集合进行遍历?
之前都是通过索引的方式进行遍历,但是这种方式并不适用于所有的集合。
因为有些集合没有索引。
有一种通用的遍历方式,叫做迭代器遍历,可以遍历所有的集合。
迭代器就是一个遍历集合的工具,你可以把它看成一个光标(指针),这个光标最开始指向集合的最开头。
如何才能获取到一个集合的迭代器呢??
可以通过Collection里面的方法
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
泛型是可以省略的,如果省略泛型,那么泛型默认是Object类型。
泛型的好处:
1. 省略了强转的代码,让代码看起来更加的简洁。
2. 把运行时异常提前到编译时期。
3.1 伪泛型(泛型擦除)
在java中的泛型是伪泛型,只在编译时期有效,一旦到了运行时期,这个泛型就会消失。俗称泛型擦除。
3.2 泛型的定义与使用
3.3.1 含有泛型的类
定义格式:修饰符 class 类名<代表泛型的变量> { }
使用格式:创建对象时,确定泛型的类型
3.3.2 含有泛型的方法
定义格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
使用格式:调用方法时,确定泛型的类型
3.3.3 含有泛型的接口
定义格式:修饰符 interface接口名<代表泛型的变量> { }
使用格式:
1. 实现类实现这个接口的时候,直接把这个泛型确定出来。
2. 实现类在实现接口的时候不确定泛型,把泛型继承下来,等到使用这个实现类对象的时候,再确定这个泛型。
3.3 泛型通配符
注意:
泛型之间是没有继承关系的。
ArrayList
如果想要在方法参数位置匹配任意类型的泛型,可以使用泛型通配符。
3.3.1 泛型通配符的使用
?: 可以表示任意类型的泛型。<br /> <br /> 注意:泛型通配符只能被动接收,不能主动使用。
3.3.2 泛型限定:
<? extends A>:泛型的类型必须是A或者A的子类。 上限, 最高到A类。
<? super A>: 泛型的类型必须是A或者A的父类。 下限, 最低到A类。
泛型作用:一般用于后期的代码重构