Iterator
单向迭代输出
常用方法:hasNext(),next();
Collection内部实现了Iterable接口,List和Set和set的子类都可以通过这个接口实现遍历输出。
以Arraylist为:
List<Integer> list = new ArrayList<>();
list.add(9);
list.add(5);
list.add(2);
list.add(7);
Iterator<Integer> itr = list.iterator();// Iterator声明对象,list.iterator返回Iterator对象
while (itr.hasNext()) {// 判断是否有下一个数据
System.out.println(itr.next());// 遍历输出
}
以TreeSet为例:
Set <Integer>set=new TreeSet<>();
set.add(9);
set.add(5);
set.add(2);
set.add(7);
Iterator<Integer> itr = set.iterator();// Iterator声明对象,set.iterator返回Iterator对象
while (itr.hasNext()) {// 判断是否有下一个数据
System.out.println(itr.next());// 遍历输出
}
而Set的底层实现就是Map,因此将Map转换成Set依然可以使用此方法遍历输出.
以TreeMap为例:
Map<Integer, String> map=new HashMap<>();
map.put(9, "h");
map.put(5, "o");
map.put(2, "l");
map.put(7, "a");
Set<Map.Entry<Integer, String>>set=map.entrySet();//将Map转换成Set
Iterator<Map.Entry<Integer, String>> itr=set.iterator();
while(itr.hasNext()) {
Map.Entry<Integer,String> en=itr.next();
en.getKey();
System.out.println("key: "+en.getKey()+" values: "+en.getValue());
}
ListIterator
双向迭代输出
常用方法:hasNext(),next(),hasPrevious
只有List接口内部实现 ListIterator方法,因此只有List及其子类支持这个方法。
例:
List<Integer> list = new ArrayList<>();
list.add(9);
list.add(5);
list.add(2);
list.add(7);
ListIterator<Integer> itr = list.listIterator();// Iterator声明对象,list。listIterator返回ListIterator对象
while (itr.hasNext()) {// 判断是否有下一个数据
System.out.println(itr.next());// 往后遍历输出
}
while (itr.hasPrevious()) {// itr已经遍历到最后了,因此他可以往前遍历
System.out.println(itr.previous());
}
Enumeration
枚举输出
常用方法:hasMoreElements(),nextElement()
在Vector类中提供一个有取得Enumeration接口对象的方法,因此只有 Vector 可以使用这种方式输出
例:
Vector<Integer> vector=new Vector<>();
vector.add(9);
vector.add(5);
vector.add(2);
vector.add(7);
Enumeration<Integer> en =vector.elements();
while(en.hasMoreElements()) {
System.out.println(en.nextElement());
}
foreach
foreach是java中的语法糖,可以输出任何集合类:
Map<Integer, String> map = new HashMap<>();
map.put(9, "h");
map.put(5, "o");
map.put(2, "l");
map.put(7, "a");
for(Map.Entry<Integer,String>en:map.entrySet()) {
System.out.println("key: "+en.getKey()+" values: "+en.getValue());
}
需要注意的是:在遍历集合的过程中,不可以使改集合发生结构性变化,否则会产生快速失败。
详见:https://blog.csdn.net/weixin_41891854/article/details/81748928