Java集合框架遍历之迭代器(Iterator)
什么是迭代器
- 使⽤循环遍历集合
- 普通for循环
- 增强for循环
- 什么是迭代器Iterator
- Iterator是java中的⼀个接⼝,核⼼作⽤就是⽤来遍历容器的元素,当容器实现了Iterator接⼝后,可以通过调⽤Iterator()⽅法获取⼀个 Iterator对象
- 为啥是调⽤容器⾥⾯的Iterator⽅法呢?
- 因为容器的实现有多种,不同的容器遍历规则不⼀样,⽐如
ArrayList/LinkedList/HashSet/TreeSet
等,所以设计了Iterator接⼝,让容器本身去实现这个接⼝,实现⾥⾯的⽅法,从⽽让开发⼈员不⽤关系容器的遍历机制,直接使⽤对应的⽅法即可
- 因为容器的实现有多种,不同的容器遍历规则不⼀样,⽐如
- 三个核⼼⽅法
boolean hashNext()
- ⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false
Obejct next()
- 返回iterator的下⼀个元素,同时指针也会向后移动1位
void remove()
- 删除指针的上⼀个元素(容易出问题,删除元素不建议使⽤容器⾃⼰的⽅法)
迭代器遍历集合
- 删除指针的上⼀个元素(容易出问题,删除元素不建议使⽤容器⾃⼰的⽅法)
package domee.chapter9_1;
import java.util.*;
public class IteratorTest {
public static void main(String[] args) {
testSet();
System.out.println("=================");
testList();
}
public static void testList(){
List<String> list = new LinkedList<>();
list.add("111");
list.add("222");
list.add("333");
list.add("444");
list.add("111");
list.add("B");
list.add("C");
list.add("A");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
if (str.equals("111")){
iterator.remove();
}
System.out.println(str);
}
}
public static void testSet(){
Set<String> set = new HashSet<>();
set.add("111");
set.add("222");
set.add("333");
set.add("444");
set.add("111");
set.add("B");
set.add("C");
set.add("A");
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
}
}
}
详细讲解迭代器的进阶知识和注意事项
- 迭代器是一种设计模式
- 三个核心方法
- boolean hashNext()
- ⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false
- Obejct next()
- 返回iterator的下⼀个元素,同时指针也会向后移动1位
- void remove()
- 删除指针的上⼀个元素
- 只有当next执⾏完后,才能调⽤remove函数
- 如要删除第⼀个元素,不能直接调⽤ remove(),要先next⼀下()否则调⽤remove⽅法是 会抛出异常的
迭代器遍历元素时不能通过Collection接⼝中的remove⽅法删除元素,只能⽤Iterator的remove⽅法删除元素; 原因 某个线程在 Collection 上进⾏迭代时,不允许另⼀个线程修改该 Collection
public static void testList(){
List<String> list = new ArrayList<>();
list.add("jack");
list.add("tom");
list.add("mary");
list.add("tim");
list.add("tony");
list.add("eric");
list.add("jack");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
if("jack".equals(str)){
list.remove(str);//ConcurrentModificationException并发修改异常
}
System.out.println(str);
}
}
- 迭代出的对象是引⽤的拷⻉,如果修改迭代中的元素,那么就是修改容器对象的本身
- 和for循环对⽐
- for循环适合顺序访问,或者通过下标进⾏访问的
- 迭代器适合链式结构
- 最终看使⽤场景,性能会有轻微差别,但是可以忽略