4.30Java Iterator迭代器遍历容器元素(List/Set/Map)

4.30Java Iterator迭代器遍历容器元素(List/Set/Map)

迭代器的作用

迭代器遍历List

迭代器中遍历List

可以使用for循环进行遍历

  • 先获得一个迭代器对象---在for里面

  • 获得以后直接通过hashNext方法实现遍历

iterator遍历元素的方法

首先来看看iterator的源码:

public interface Iterator<E> {
   //定义了一个hashNext的布尔量
   boolean hashNext;
   
   //定义一个next属性
   next;
   
   //定义一个remove方法
   default void remove(){
       throw new UnsupportedOperationException("remove");
  }
}
  • 通过hashNext属性可以判断有没有下一个元素

4.30Java Iterator迭代器遍历容器元素(List/Set/Map)

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);
      }
  }
}

迭代器中遍历Set

实现:

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);
      }
  }
}

迭代器中遍历Map

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值然后循环

  •  

 

 

上一篇:关于python中可迭代对象和迭代器的一些理解


下一篇:Python学习-函数名的应用、格式化输出、可迭代对象与迭代器