欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Iterator迭代器

程序员文章站 2022-07-12 11:54:07
...

上一篇已经说过了Iterator迭代器的原理是使用内部类实现的,现在说说

迭代器的取值方式和对元素操作的注意事项:

 

1.迭代器的取值方式一般有两种:

	public class IteratorDemo {									
		
		public static void main(String[] args)								
		{								
			Collection coll = new ArrayList();							
										
			coll.add("abc1");							
			coll.add("abc2");							
			coll.add("abc3");							
			coll.add("abc4");												
										
			Iterator it1 = coll.iterator();							
										
//			next方法自动往下取元素.							
//			当取到了不存在的元素。NoSuchElementException							
			//取法一							
			while (it1.hasNext())							
			{							
										
				System.out.println(it1.next());						
			}							
			System.out.println(it1.hasNext());  //false 但it1还有							
										
			Collection coll2 = new ArrayList();							
										
			coll2.add("abc1");							
			coll2.add("abc2");							
			coll2.add("abc3");							
			coll2.add("abc4");							
			//常用的取法二							
			for (Iterator it = coll2.iterator(); it.hasNext(); ){							
				System.out.println (it.next()+"----------");						
			}							
		}								
	}	

 

2.Iterator迭代器在取值时的请注意不要同时使用集合增加,修改元素:

/*
	在迭代过程中,如果使用集合对象继续操作元素,有可能发生ConcurrentModificationException。
	
	所以,需要做的是要么使用集合对象操作元素,
	要么使用迭代器操作元素。不要同时使用。
	
	在迭代过程中如果需要操作元素,可以使用迭代器的方法。
	但是很遗憾,Iterator中只有对元素的判断,获取,删除操作,
	
	这是就需要使用Iterator对象子接口来实现。就是 ListIterator.注意这个列表迭代器只有List集合具备。
	ListIterator具备在迭代过程中对元素进行增删改查的动作。
*/

public class ListIteratorDemo {

	public static void main(String[] args) 
	{
		List<String> list = new ArrayList<String>();

		list.add("abc1");
		list.add("abc2");
		list.add("abc3");

		Iterator<String> it  = list.iterator();
		
		ListIterator<String> liIterator = list.listIterator();

		
	/*	while(it.hasNext())
		{
			String str = (String)it.next();
			System.out.println(str);
			
			if(str.equals("abc2"))
				list.add("abcxxx");//这里使用了迭代器和集合本身同时操作元素的错误,会报异常:ConcurrentModificationException
		}*/
		
		while(liIterator.hasNext())
		{
			String str = (String)liIterator.next();
			System.out.println("取值:"+str);
			
			if(str.equals("abc2")){
				liIterator.set("xxx");
			}else if(str.equals("abc3")){
				liIterator.add("yyy");
			}else if(str.equals("abc1")){
				liIterator.remove();
			}
		}

		System.out.println("修改后的值:"+list);//[xxx, abc3, yyy]


		while(liIterator.hasPrevious())//从下往上取值
		{
			System.out.println("修改后的从下往上取值:"+liIterator.previous());
		}
	}
}

 ListIteratorDemo类中main方法执行后输出的值为:

取值:abc1

取值:abc2

取值:abc3

修改后的值:[xxx, abc3, yyy]

修改后的从下往上取值:yyy

修改后的从下往上取值:abc3

修改后的从下往上取值:xxx