什么是迭代器
- 使⽤循环遍历集合
- 普通for循环
- 增强for循环
- 什么是迭代器Iterator
- Iterator是java中的⼀个接⼝,核⼼作⽤就是⽤来遍历容器的元素,当容器实现了Iterator接⼝后,可以通过调⽤Iterator()⽅法获取⼀个 Iterator对象
- 为啥是调⽤容器⾥⾯的Iterator⽅法呢?
- 因为容器的实现有多种,不同的容器遍历规则不⼀样,⽐如ArrayList/LinkedList/HashSet/TreeSet等,所以设计了Iterator接⼝,让容器本身去实现这个接⼝,实现⾥⾯的⽅法,从⽽让开发⼈员不⽤关系容器的遍历机制,直接使⽤对应的⽅法即可。
迭代器的三个核心方法
public class IteratorTest {
public static void main(String[] args) {
test();
}
//使用的set集合自动去重,list集合同理,可重复
public static void test(){
Set<String> set=new HashSet<>();
set.add("jjbq");
set.add("junko");
set.add("jjbq");
System.out.println(set);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
详细讲解迭代器的进阶知识和注意事项
- 迭代器属于一种设计模式
- 三个核心方法的详细操作
/*
boolean hashNext()
⽤于判断iterator内是否有下个元素,如果有则返回true,没有则false
Obejct next()
返回iterator的下⼀个元素,同时指针也会向后移动1位
void remove()
删除指针的上⼀个元素
只有当next执⾏完后,才能调⽤remove函数
如要删除第⼀个元素,不能直接调⽤ remove(),要先next⼀下()否则调⽤remove⽅法是会抛出异常的*/
- 迭代器遍历元素时不能通过Collection接⼝中的remove⽅法删除元素,只能⽤Iterator的remove⽅法删除元素; 原因 某个线程在Collection 上进⾏迭代时,不允许另⼀个线程修改该 Collection
迭代器本身在服务集合,如果在迭代循环过程中remove的时候使用集合的方法,就像是搬运的东西被偷走了,所以会出问题。在此中途可以break一下,就不会报错。
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并发修改异常
break;//及时终止循环,就不会有异常
}
System.out.println(str);
}
}
- 迭代出的对象是引⽤的拷⻉,如果修改迭代中的元素,那么就是修改容器对象的本身
- 和for循环对⽐
- for循环适合顺序访问,或者通过下标进⾏访问的
- 迭代器适合链式结构
- 和for循环对⽐
最终看使⽤场景,性能会有轻微差别,但是可以忽略
补充:Map集合迭代器的使用用例
public static void testMap(){
Map<String,String> map=new HashMap<>();
map.put("jjbq","23");
map.put("junko","24");
System.out.println("------循环key获取value打印------");
for (String s : map.keySet()) {
System.out.println(map.get(s));
}
Set<Map.Entry<String, String>> entrySet = map.entrySet();
System.out.println("------entryset遍历输出------");
System.out.println(entrySet);
for (Map.Entry<String, String> stringStringEntry : entrySet) {
System.out.println(stringStringEntry.getKey()+":"+stringStringEntry.getValue());
}
System.out.println("------迭代器打印------");
Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
while (iterator.hasNext()){
Map.Entry<String, String> entry = iterator.next();
String str = entry.getKey() + ":" + entry.getValue();
System.out.println(str);
}