迭代器遍历List
可以使用for循环进行遍历
先获得一个迭代器对象---在for里面
获得以后直接通过hashNext方法实现遍历
首先来看看iterator的源码:
public interface Iterator<E> { //定义了一个hashNext的布尔量 boolean hashNext; //定义一个next属性 next; //定义一个remove方法 default void remove(){ throw new UnsupportedOperationException("remove"); } }
通过hashNext属性可以判断有没有下一个元素
hashNext和Next组合起来使用,形成判断的闭环
List继承了Collection类,该类也实现了Iterator接口。
iterator方法帮助我们获得一个迭代器对象
Iterator帮助我们定义了迭代器里面应该有的方法
iterator遍历List:
package collection.iterator; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 测试迭代器遍历List、Set、Map * @author Lucifer */ public class TestIterator { /*实现遍历List的方法---先定义方法内容*/ public static void testIteratorList(){ //方法名遵从驼峰规则 /*要遍历List就要先有List*/ List<String> list = new ArrayList<>(); /* 1.ArrayList是一个类,继承了AbstractList类 2.AbstractList类继承了AbstractCollection 3.AbstractList类同是实现了List接口 */ list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); /*创建迭代器变量---循环获得对象(所以for的第一步是创建对象,循环进行判断(判断是否有下一个元素---利用iterator里面自带的属性)*/ for (Iterator<String> iter = list.iterator(); list.iterator().hasNext();){ //调用hashNext方法不能用iter而是用list.iterator方法 /*用iter.next返回当前对象通过又让游标往下移动一格*/ String temp = iter.next(); //把当前内容返回然后回到头进行判断看有没有下一个元素 System.out.println(temp); } } }
实现:
package collection.iterator; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 测试迭代器遍历List、Set、Map * @author Lucifer */ public class TestIterator { /*实现遍历List的方法---先定义方法内容*/ public static void testIteratorList(){ //方法名遵从驼峰规则 /*要遍历List就要先有List*/ List<String> list = new ArrayList<>(); /* 1.ArrayList是一个类,继承了AbstractList类 2.AbstractList类继承了AbstractCollection 3.AbstractList类同是实现了List接口 */ list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); /*创建迭代器变量---循环获得对象(所以for的第一步是创建对象,循环进行判断(判断是否有下一个元素---利用iterator里面自带的属性)*/ for (Iterator<String> iter = list.iterator(); list.iterator().hasNext();){ //调用hashNext方法不能用iter而是用list.iterator方法 /*用iter.next返回当前对象通过又让游标往下移动一格*/ String temp = iter.next(); //把当前内容返回然后回到头进行判断看有没有下一个元素 System.out.println(temp); } } }
实现:
package collection.iterator; import java.util.*; /** * 测试迭代器iterator遍历Set * @author Lucifer */ public class TestIteratorSet { /*实现遍历Set的方法---先定义方法内容*/ public static void testIteratorSet(){ //方法名遵从驼峰规则 /*要遍历Set就要先有Set*/ Set<String> set = new HashSet<>(); /* 1.ArrayList是一个类,继承了AbstractList类 2.AbstractList类继承了AbstractCollection 3.AbstractList类同是实现了List接口 */ set.add("aa"); set.add("bb"); set.add("cc"); set.add("dd"); /*创建迭代器变量---循环获得对象(所以for的第一步是创建对象,循环进行判断(判断是否有下一个元素---利用iterator里面自带的属性)*/ for (Iterator<String> iter = set.iterator(); set.iterator().hasNext();){ //调用hashNext方法不能用iter而是用list.iterator方法 /*用iter.next返回当前对象通过又让游标往下移动一格*/ String temp = iter.next(); //把当前内容返回然后回到头进行判断看有没有下一个元素 System.out.println(temp); } } }
package collection.iterator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * 测试迭代器Iterator遍历Map * @author Lucifer */ public class TestIteratorMap { /*定义iterator遍历方法*/ public static void testIteratorMap(){ //这是一个类方法,通过类名.方法名调用 Map<Integer,String> map = new HashMap<>(); //往Map里面添加元素 map.put(100,"aa"); map.put(200,"bb"); map.put(300,"cc"); /*遍历Map通过节点遍历*/ //获得一个Set Set<Map.Entry<Integer, String>> ss = map.entrySet(); //返回是一个set集合 /* 1.通过map.entrySet获得一个Set集合 2.Set里面放置的是一个集合(Entry) 3.在Entry集合里面防止的是泛型<Integer,String> <Map.Entry<Integer, String>>这个是一个键值对的泛型 */ //在键值对当中进行迭代器迭代 for (Iterator<Map.Entry<Integer,String>> iter = ss.iterator(); iter.hasNext();){ //在这个里面继续进行遍历---通过.next方法返回一个Entry Map.Entry<Integer,String> temp = iter.next(); //通过temp.getKey获得键,temp.getValue获得值 System.out.println(temp.getKey() + "---" + temp.getValue()); } } /*也可以通过keySet获得键,通过键去遍历容器*/ public static void testIteratorMapNo2(){ //这是一个类方法,通过类名.方法名调用 Map<Integer,String> map = new HashMap<>(); //往Map里面添加元素 map.put(100,"aa"); map.put(200,"bb"); map.put(300,"cc"); //首先先获得键的集合 Set<Integer> keySet = map.keySet(); //利用for循环通过键的值去遍历---键的类型是Integer for (Iterator<Integer> iter = keySet.iterator(); iter.hasNext();){ //获得了键以后取出键 Integer key = iter.next(); //通过key获取---用get方法 System.out.println(key + "---" + map.get(key)); } } }
测试类:
package collection.iterator; /** * 测试TestIterator接口当中的方法 * @author Lucfier */ public class Test { public static void main(String[] args) { /*类名调用方法遍历List*/ TestIterator.testIteratorList(); /*类名调用方法遍历Set*/ TestIteratorSet.testIteratorSet(); /*类名调用方法遍历Map*/ TestIteratorMap.testIteratorMap(); TestIteratorMap.testIteratorMapNo2(); } }
特点:
Java当中为容器提供了统一的接口iterator它可以遍历List、Map、Set
方法类似,都是通过循环捕获对象进行遍历,这里要注意他的for的条件
循环初始值为通过iterator方法捕获的返回的链表(List和Set)
循环结束条件为iterator接口中的hasNext为null时结束
Map的话初始值变为iterator方法捕获的key、value值---也可以是key值然后循环