Java拾贝第十五天——集合之Iterator迭代器
1.Java拾贝第一天——数据类型与运算符杂记2.Java拾贝第二天——方法、方法的重载3.Java拾贝第二天——面向对象4.Java拾贝第三天——面向对象25.Java拾贝第四天——String和匿名对象6.Java拾贝第四天——面向对象37.Java拾贝第四天——动态绑定机制8.Java拾贝第五天——抽象和接口9.Java拾贝第五天——静态和代码块10.Java拾贝第五天——内部类11.Java拾贝第六天——匿名内部类12.Java拾贝第七天——包装类、BigInteger、BigDecimal13.Java拾贝第七天——异常14.Java拾贝第七天——throws和throw、自定义异常15.Java拾贝第七天——断言16.Java拾贝第八天(补档!)——访问修饰符,命名规范17.Java拾贝第八天——多线程的创建18.Java拾贝第八天——线程的状态和常用方法19.Java拾贝第九天——synchronized关键字20.Java拾贝第九天——泛型21.Java拾贝第十天——通配符与泛型22.Java拾贝第十一天——IO之File类23.Java拾贝第十一天——IO流之字节流24.Java拾贝第十一天——IO流之字符流25.Java拾贝第十一天——IO流之字节流复制图片、视频26.Java拾贝第十二天——IO流之打印流27.Java拾贝第十二天——System类28.Java拾贝第十二天——IO流之转换流29.Java拾贝第十二天——IO流之对象序列化与对象流30.Java拾贝第十三天——集合之List31.Java拾贝第十四天——集合之Set
32.Java拾贝第十五天——集合之Iterator迭代器
33.Java拾贝第十五天——集合之Map34.Java拾贝第十六天——集合之Queue、Stack35.Java拾贝第十六天——其他集合类Properties36.Java拾贝第十七天——反射之初识Class类37.Java拾贝第十七天——反射之认识反射相关类38.Java拾贝第十八天——反射之使用反射修改属性39.Java拾贝第十九天——注解虽然for each循环可以遍历集合输出,但书上提及了一个观点。
只要碰到了集合输出的操作,就一定要使用Iterator(迭代器)接口
实际上编译器把for each循环通过Iterator改写为了普通的for循环
上述的观点在本文最后一部分会提及。
Iterator
Iterator是专门的迭代输出接口,所谓迭代就是将元素一个个进行判断,判断是否有内容,如果有则把内容取出:
Iterator接口定义如下:
public interface Iterator<E>
也使用了泛型,当然迭代器的泛型需要和集合指定的泛型相同。
Iterator内部定义了三个方法:
方法 | 类型 | 描述 |
---|---|---|
boolean hasNext() | 普通方法 | 判断是否有下一个值 |
E next() | 普通方法 | 取出当前元素 |
void remove() | 普通方法 | 移除当前元素 |
接口中的方法默认公开抽象 public abstract
如何实例化Iterator()
在Collection接口中定义了Iterator()方法为某集合实例化一个迭代器。
既然Collection接口中存在了此方法,那么List接口和Set接口的实现类也可也使用该方法调用迭代器。
boolean hasNext() 和 E next()
判断是否有下一个值 和 取出当前元素
栗子:
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("你好");
list.add("嗨咯");
list.add("hello");
list.add("hi");
Iterator<String> iterator = list.iterator();//返回一个迭代器实例
while (iterator.hasNext()){
System.out.println(iterator.next());//输出当前元素
}
}
程序运行结果:
你好
嗨咯
hello
hi
void remove()
删除当前元素
栗子:
public static void main(String[] args) {
List<String> list=new ArrayList<>();
list.add("你好");
list.add("嗨咯");
list.add("hello");
list.add("hi");
Iterator<String> iterator = list.iterator();//返回一个迭代器实例
while (iterator.hasNext()){
String temp =iterator.next();//拿一个变量接收当前对象
if (temp.equals("hi")){
iterator.remove();//删除hi
}else {
System.out.println(temp);
}
}
}
程序运行结果:
你好
嗨咯
hello
注意
此时调用的是迭代器里的remove()方法。
如果在迭代器输出时用集合对象remove()方法会导致异常:
栗子:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("你好");
list.add("嗨咯");
list.add("hello");
list.add("hi");
Iterator<String> iterator = list.iterator();//返回一个迭代器实例
while (iterator.hasNext()) {
String temp = iterator.next();//拿一个变量接收当前对象
if (temp.equals("hi")) {
list.remove(temp);
} else {
System.out.println(temp);
}
}
}
程序运行结果:
你好
嗨咯
hello
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
at java.util.ArrayList$Itr.next(ArrayList.java:861)
at moudle2.Test15.main(Test15.java:17)
Process finished with exit code 1
因为此时集合本身被破坏了,迭代出现错误。
为什么一定要使用Iterator?
因为使用for循环进行遍历集合需要知道集合的内部构造。
如果遍历有序集合,直接使用下标即可。
如果遍历无序集合,无法像有序集合一样使用下标进行遍历。
所以使用迭代器的好处就是不用知道集合的内部构造。
一种方式针对多种集合,万金油的遍历方式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-11-03 XML极速入门