java基础9——几个重要的API之迭代器Iterator

1. 体系结构

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

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

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

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

2. 常用API

2.1. Iterator iterator() 返回该集合的迭代器对象

2.2 public interface Iterable<T>

注意:Itreable   该接口仅有一个方法,用于返回集合迭代器对象。

2.3 Iterator接口定义的方法,该接口是集合的迭代器接口类

1:boolean hasNext()  判断集合中是否有元素,如果有元素可以迭代,就返回true。

2: E next()  返回迭代的下一个元素,注意: 如果没有下一个元素时,调用next元素会抛出NoSuchElementException

3: void remove()从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。

3. 迭代器遍历

3.1 while循环

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

3.2 for循环

import java.util.ArrayList;
import java.util.Iterator;

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 循环。因为可以对内存进行一下优化。

3.3 使用迭代器清空集合

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

注意:

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

import java.util.ArrayList;
import java.util.Iterator;

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

		Iterator it = list.iterator();
		while (it.hasNext()) {
			String next = (String) it.next();
			System.out.println(next);
		}
		// 迭代器的指针已经指向了集合的末尾
		// String next = (String) it.next();
		// java.util.NoSuchElementException
	}
}

2. 如果调用remove之前没有调用next是不合法的,会抛出IllegalStateException

import java.util.ArrayList;
import java.util.Iterator;

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

		Iterator it = list.iterator();
		while (it.hasNext()) {
			// 调用remove之前没有调用next是不合法的
			// it.remove();
			// java.lang.IllegalStateException
			String next = (String) it.next();
			System.out.println(next);
		}

	}
}

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

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

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;	
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);
	}
}

注意:如果是List集合,想要在迭代中操作元素可以使用List集合的特有迭代器ListIterator,该迭代器支持在迭代过程中,添加元素和修改元素

4. 特有的迭代器

public interface ListIterator extends Iterator

ListIterator<E> listIterator()

---| Iterator

       hasNext()

       next()

       remove()

       ------| ListIterator Iterator子接口 List专属的迭代器

                  add(E e)    将指定的元素插入列表(可选操作)。该元素直接插入到 next 返回的下一个元素的前面(如果有)

                  void set(E o)   用指定元素替换 next 或 previous 返回的最后一个元素

                  hasPrevious()    逆向遍历列表,列表迭代器有多个元素,则返回 true。

                  previous()       返回列表中的前一个元素

Iterator在迭代时,只能对元素进行获取(next())和删除(remove())的操作。Iterator 的子接口ListIterator 在迭代list 集合时,还可以对元素进行添加(add(obj)),修改set(obj)的操作

import java.util.ArrayList;
import java.util.ListIterator;

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);
         // 获取List专属的迭代器
		ListIterator lit = list.listIterator();

		while (lit.hasNext()) {
			String next = (String) lit.next();
			System.out.println(next);
		}

	}
}

倒序遍历

import java.util.ArrayList;

import java.util.ListIterator;

 

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

        // 获取List专属的迭代器

       ListIterator lit = list.listIterator();

       while (lit.hasNext()) {

           String next = (String) lit.next();

           System.out.println(next);

       }

       System.out.println("***************");

       while (lit.hasPrevious()) {

           String next = (String) lit.previous();

           System.out.println(next);

       }

 

    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值