java基础:13.2 集合框架 - Iterator、Iterable

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/L20902/article/details/89004289

1、Iterable

Iterable英文意思为:可迭代的、迭代器、可遍历的.

Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素
Iterable 接口中定义了iterator方法,该方法会返回一个迭代器。Iterator 接口提供了遍历合集中元素的方法。

修饰符和返回值 方法名 描述
Iterator iterator() 返回一个内部元素为T类型的迭代器
default void forEach(Consumer<? super T> action) 对内部元素进行遍历,并对元素进行指定的操作
default Spliterator spliterator() 创建并返回一个可分割迭代器
        Iterator<Integer> iterator=list.iterator();  //获取ArrayList内部迭代器
        while(iterator.hasNext()){                   //hasNext()方法判断是否还有元素
            System.out.println(iterator.next());     //next()返回当前元素,并且将指针移向下个元素

还可以使用"for-each loop"形式进行遍历,增强for形式在Java中只是一个语法,实际编译的时候,还是会转换为迭代器形式,

for (Integer integer : list) {
         System.out.println(integer);
     }

进行迭代遍历的时候我们需要注意在遍历的过程中,如果我们对元素进行添加删除,那么会造成并行修改异常(ConcurrentModificationException)!!
对于这种情况,我们应当使用迭代器Iterator内部的remove()方法,而不是使用集合list直接删除元素。

     Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            Integer i = iterator.next();
            if (i == 2) {
                list.remove(i); /* 错误写法!*/
                iterator.remove();  /* 正确做法! */
            }
        }

如果我们自己想自己写一个集合,实现Iterable接口,并可以使用"for-each loop"形式遍历,那么我们需要自己来重写一个迭代器(Iterator)并返回它。

public class MyCollection<E> implements Iterable<E> {
    @Override
    public Iterator iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator<E>{
        @Override
        public boolean hasNext() {
            return false;
        }
        @Override
        public E next() {
            return null;
        }
    }
}

 
 

2、迭代器Iterator

每种合集都是可迭代的(Iterable) 。可以获得集合的 Iterator对象来遍历合集中的所有元素。

Iterator 是一种经典的设计模式,用于在不需要暴露数据是如何保存在数据结构的细节的情况下,来遍历一个数据结构

Collection 接口继承自 Iterable 接口。
Iterable 接口中定义了iterator方法,该方法会返回一个迭代器。Iterator 接口提供了遍历合集中元素的方法。
iterator()方法返回一个Iterator 的实例。用next()方法提供对合集中元素的顺序访问

        for (Iterator<Hero> iterator = heros.iterator(); iterator.hasNext();) {
            Hero hero = (Hero) iterator.next();
            System.out.println(hero);
        }

		or
		// 向后遍历
		Iterator<Strting> iterator = list.iterator();
		while(iteator.hasNext())
		      System.out.print(iterator.next().toUpperCase() + "  ");
		System.out.println();
		
		//向前遍历
		iterator= list.iterator(list. size());
			while (iterator.hasPrevious()) {
		System . out.print(iterator.previous() + " ") ;
		}

 
 

猜你喜欢

转载自blog.csdn.net/L20902/article/details/89004289
今日推荐