1. 体系结构
---| Itreable 接口 实现该接口可以使用增强for循环
---| Collection 描述所有集合共性的接口
---| List接口 可以有重复元素的集合
---| Set接口 不可以有重复元素的集合
2. 常用API
2.1. Iterator iterator() 返回该集合的迭代器对象
2.2 public interface Iterable<T>
注意:Itreable 该接口仅有一个方法,用于返回集合迭代器对象。
2.3 Iterator接口定义的方法,该接口是集合的迭代器接口类
1:boolean hasNext() 判断集合中是否有元素,如果有元素可以迭代,就返回true。
2: E next() 返回迭代的下一个元素,注意: 如果没有下一个元素时,调用next元素会抛出NoSuchElementException
3: void remove()从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。
3. 迭代器遍历
3.1 while循环
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定对象存储到容器中
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言程序设计");
System.out.println(list);
Iterator it = list.iterator();
while (it.hasNext()) {
String next = (String) it.next();
System.out.println(next);
}
}
3.2 for循环
import java.util.ArrayList;
import java.util.Iterator;
public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定对象存储到容器中
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言程序设计");
System.out.println(list);
for (Iterator it = list.iterator(); it.hasNext();) {
//迭代器的next方法返回值类型是Object,所以要记得类型转换。
String next = (String) it.next();
System.out.println(next);
}
}
}
注意:需要取出所有元素时,可以通过循环,java 建议使用for 循环。因为可以对内存进行一下优化。
3.3 使用迭代器清空集合
public class Demo1 {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
System.out.println(coll);
Iterator it = coll.iterator();
while (it.hasNext()) {
it.next();
it.remove();
}
System.out.println(coll);
}
}
注意:
1. 如果迭代器的指针已经指向了集合的末尾,那么如果再调用next()会返回NoSuchElementException异常
import java.util.ArrayList;
import java.util.Iterator;
public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定对象存储到容器中
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言程序设计");
System.out.println(list);
Iterator it = list.iterator();
while (it.hasNext()) {
String next = (String) it.next();
System.out.println(next);
}
// 迭代器的指针已经指向了集合的末尾
// String next = (String) it.next();
// java.util.NoSuchElementException
}
}
2. 如果调用remove之前没有调用next是不合法的,会抛出IllegalStateException
import java.util.ArrayList;
import java.util.Iterator;
public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定对象存储到容器中
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言程序设计");
System.out.println(list);
Iterator it = list.iterator();
while (it.hasNext()) {
// 调用remove之前没有调用next是不合法的
// it.remove();
// java.lang.IllegalStateException
String next = (String) it.next();
System.out.println(next);
}
}
}
注意:在对集合进行迭代过程中,不允许出现迭代器以外的对元素的操作,因为这样会产生安全隐患,java会抛出异常并发修改异常(ConcurrentModificationException),普通迭代器只支持在迭代过程中的删除动作
ConcurrentModificationException: 当一个集合在循环中即使用引用变量操作集合又使用迭代器操作集合对象, 会抛出该异常
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo1 {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
System.out.println(coll);
Iterator it = coll.iterator();
while (it.hasNext()) {
it.next();
it.remove();
coll.add("abc"); // 出现了迭代器以外的对元素的操作
}
System.out.println(coll);
}
}
注意:如果是List集合,想要在迭代中操作元素可以使用List集合的特有迭代器ListIterator,该迭代器支持在迭代过程中,添加元素和修改元素
4. 特有的迭代器
public interface ListIterator extends Iterator
ListIterator<E> listIterator()
---| Iterator
hasNext()
next()
remove()
------| ListIterator Iterator子接口 List专属的迭代器
add(E e) 将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有)
void set(E o) 用指定元素替换 next 或 previous 返回的最后一个元素
hasPrevious() 逆向遍历列表,列表迭代器有多个元素,则返回 true。
previous() 返回列表中的前一个元素
Iterator在迭代时,只能对元素进行获取(next())和删除(remove())的操作。Iterator 的子接口ListIterator 在迭代list 集合时,还可以对元素进行添加(add(obj)),修改set(obj)的操作
import java.util.ArrayList;
import java.util.ListIterator;
public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定对象存储到容器中
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言程序设计");
System.out.println(list);
// 获取List专属的迭代器
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String next = (String) lit.next();
System.out.println(next);
}
}
}
倒序遍历
import java.util.ArrayList;
import java.util.ListIterator;
public class Demo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
// 增加:add() 将指定对象存储到容器中
list.add("计算机网络");
list.add("现代操作系统");
list.add("java编程思想");
list.add("java核心技术");
list.add("java语言程序设计");
System.out.println(list);
// 获取List专属的迭代器
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String next = (String) lit.next();
System.out.println(next);
}
System.out.println("***************");
while (lit.hasPrevious()) {
String next = (String) lit.previous();
System.out.println(next);
}
}
}