浅析迭代器及其用法

在程序开发过程中,经常需要遍历集合中的元素,针对这一点,jdk专门提供了一个接口Iterator.Iterator接口也是Java集合框架中的一员,但是它与collection、map接口有所不同,collection接口与map接口主要用于存储元素,而Iterator主要用于迭代访问collection中的元素,也就是遍历。 java中的Iterator一般称为“轻量级”对象,创建它的代价是比较小的。该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.

对Collection 进行迭代的类,称其为迭代器。还是面向对象的思想,专业对象做专业的事情,迭代器就是专门取出集合元素的对象。但是该对象比较特殊,不能通过new直接创建对象,该对象是以内部类的形式存在于每个集合类的内部。在Collection接口中定义了获取集合类迭代器的方法(iterator()),所以所有的Collection体系集合都可以获取自身的迭代器。

该类主要用于遍历集合对象,该类描述了遍历集合的常见方法

           1:java.lang. Itreable 

            ---| Itreable      接口 实现该接口可以使用增强for循环

              ---| Collection      描述所有集合共性的接口

                  ---| List接口     可以有重复元素的集合

                  ---| Set接口      不可以有重复元素的集合

Itreator   该接口是集合的迭代器接口类,定义了常见的迭代方法

    1:boolean hasNext()

                     判断集合中是否有元素,如果有元素可以迭代,就返回true。

    2: E next() 

                     返回迭代的下一个元素,注意: 如果没有下一个元素时,调用

next元素会抛出NoSuchElementException

    3: void remove()

                     从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操

作)。

那么Itreator是如何进行遍历的呢?


下面就用实际代码演示

public static void main(String[] args) {
		ArrayList list = new ArrayList();
		// 增加:add() 将指定对象存储到容器中
		list.add("计算机网络");
		list.add("现代操作系统");
		list.add("java编程思想");
		list.add("java核心技术");
		list.add("java语言程序设计");
		System.out.println(list);
		Iterator it = list.iterator();
		while (it.hasNext()) {
			String next = (String) it.next();
			System.out.println(next);
		}
	}

这有一个小细节要说一下:

细节一:

如果迭代器的指针已经指向了集合的末尾,那么如果再调用next()会返回NoSuchElementException异常

拓展,也可以将迭代器放在增强for循环中遍历:

public class Demo2 {
	public static void main(String[] args) {
		ArrayList list = new ArrayList();
		// 增加:add() 将指定对象存储到容器中
		list.add("计算机网络");
		list.add("现代操作系统");
		list.add("java编程思想");
		list.add("java核心技术");
		list.add("java语言程序设计");
		System.out.println(list);

		for (Iterator it = list.iterator(); it.hasNext();) {
             //迭代器的next方法返回值类型是Object,所以要记得类型转换。
			String next = (String) it.next();
			System.out.println(next);
		}
	}
}

需要取出所有元素时,可以通过循环,java 建议使用for 循环。因为可以对内存进行一下优化。

那么如何通过迭代器进行删除呢?那就还是用代码做实际演示吧(我这里的删除是指清空整个集合)

public class Demo1 {
	public static void main(String[] args) {
		Collection coll = new ArrayList();
		coll.add("aaa");
		coll.add("bbb");
		coll.add("ccc");
		coll.add("ddd");
		System.out.println(coll);
		Iterator it = coll.iterator();
		while (it.hasNext()) {
			it.next();
			it.remove();
		}
		System.out.println(coll);
	}
}

细节二:

 如果调用remove之前没有调用next是不合法的,会抛出IllegalStateException。这个小细节我会再写一个详细的博客来阐述。

细节三:注意在对集合进行迭代过程中,不允许出现迭代器以外的对元素的操作,因为这样会产生安全隐患,java会抛出异常并发修改异常(ConcurrentModificationException),普通迭代器只支持在迭代过程中的删除动作。

注意:      ConcurrentModificationException: 当一个集合在循环中即使用引用变量操作集合又使用迭代器操作集合对象, 会抛出该异常。

下面这个就是演示。

public class Demo1 {
	public static void main(String[] args) {
		Collection coll = new ArrayList();
		coll.add("aaa");
		coll.add("bbb");
		coll.add("ccc");
		coll.add("ddd");
		System.out.println(coll);
		Iterator it = coll.iterator();
		while (it.hasNext()) {
			it.next();
			it.remove();
			coll.add("abc"); // 出现了迭代器以外的对元素的操作
		}
		System.out.println(coll);
	}
}

猜你喜欢

转载自blog.csdn.net/loveliness_peri/article/details/80171798
今日推荐