`

JAVA基础 之 Iterator

    博客分类:
  • java
阅读更多

概述:

    1.Iterator是一个迭代器(不是承载数据的工具)

    2.本文重点讲述了Iterator删除问题(工作中遇到的问题)

 

package com.cxy.collection;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * @author cxy
 */
public class IteratorTest
{
	/**
	 * 说明:
	 * 1.Iterator是一个迭代器
	 * 2.Iterator删除问题(工作中遇到的问题)
	 */
	public static void main(String[] args)
	{
		Set<String> s = new HashSet<String>();
		s.add("苹果");
		s.add("香蕉");
		s.add("橘子");
		
		//正常使用,带泛型的迭代器
		Iterator<String> it = s.iterator();
		while(it.hasNext())
		{
			System.out.print(it.next()+"  ");
		}
		
		while(it.hasNext())
		{
			System.out.print(it.next()+"  ");
		}
		//发现第二次访问没有打印任何东西,因为it已经迭代到最后 it.hasNext() 是false
		System.out.println("");
		System.out.println("===================");
		
		//删除问题:工作中经常想用java去处理数据集合,例如:去掉某些不合要求的数据
		it = s.iterator();
		while(it.hasNext())
		{
			String one = it.next(); //传值非传引用
			if("橘子".equals(one))
			{
				it.remove(); //这个删除 是从集合中删除上一次next方法返回的元素
			}
			System.out.print(one+"  ");
		}
		System.out.println(s);
		
		//上面是正规安全的删除,但是很多朋友会很自然的这样去写
		it = s.iterator();
		s.add("橘子");  //将删除的橘子加回来
		while(it.hasNext())
		{
			String one = it.next();
			if("橘子".equals(one))
			{
				//这个数据我不要了,我从集合中将其删除 OK 如果你这么做了 你会看到一个ConcurrentModificationException 异常
				 s.remove(one); 
			}
			System.out.print(one+"  ");
		}
		
	}

}

 

总结:

    1.如果你想用java去筛选数据,那么请使用iterator的remove方法

    2.foreach虽然简单 但是如果想要安全的删除集合数据还是建议使用iterator

    3.多次遍历的时候记得重新获取集合的iterator,it = s.iterator(); 否则第二次遍历将无效。

 

相关文章连接:

1.《java基础 之 集合概述》

2.《JAVA基础 之 Collection》

 

声明:

1.原创文章,转载请标明并加本文连接。

2.更详尽的API请参见  http://docs.oracle.com/javase/7/docs/api/

3.文章反映个人愚见,如有异议欢迎讨论指正 

分享到:
评论
4 楼 桃花源记 2013-05-07  
snkcxy 写道
a920829018 写道
it = s.iterator();  
        s.add("橘子");  //将删除的橘子加回来  
        while(it.hasNext())  
        {  
            String one = it.next();  
            if("橘子".equals(one))  
            {  
                //这个数据我不要了,我从集合中将其删除 OK 如果你这么做了 你会看到一个ConcurrentModificationException 异常  
                 s.remove(one);   
            }  
            System.out.print(one+"  ");  
        }  

是否添加橘子的语句:s.add("橘子");  //将删除的橘子加回来  放在it = s.iterator();这句之前比较好啊。否则发生的异常就是 由添加橘子引起的

哦 呵呵 是啊 一直没注意到这个顺序问题 

这样的异常是因为并发访问所引起的!
3 楼 snkcxy 2013-04-28  
a920829018 写道
it = s.iterator();  
        s.add("橘子");  //将删除的橘子加回来  
        while(it.hasNext())  
        {  
            String one = it.next();  
            if("橘子".equals(one))  
            {  
                //这个数据我不要了,我从集合中将其删除 OK 如果你这么做了 你会看到一个ConcurrentModificationException 异常  
                 s.remove(one);   
            }  
            System.out.print(one+"  ");  
        }  

是否添加橘子的语句:s.add("橘子");  //将删除的橘子加回来  放在it = s.iterator();这句之前比较好啊。否则发生的异常就是 由添加橘子引起的

哦 呵呵 是啊 一直没注意到这个顺序问题 
2 楼 a920829018 2013-04-28  
it = s.iterator();  
        s.add("橘子");  //将删除的橘子加回来  
        while(it.hasNext())  
        {  
            String one = it.next();  
            if("橘子".equals(one))  
            {  
                //这个数据我不要了,我从集合中将其删除 OK 如果你这么做了 你会看到一个ConcurrentModificationException 异常  
                 s.remove(one);   
            }  
            System.out.print(one+"  ");  
        }  

是否添加橘子的语句:s.add("橘子");  //将删除的橘子加回来  放在it = s.iterator();这句之前比较好啊。否则发生的异常就是 由添加橘子引起的
1 楼 a920829018 2013-04-28  
以前确实没注意这个异常,学习了

相关推荐

Global site tag (gtag.js) - Google Analytics