A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冥夜 中级黑马   /  2014-11-27 00:22  /  1185 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冥夜 于 2014-11-27 00:29 编辑

在集合的视频中有讲到,在用一个迭代器来遍历一个集合时,只能使用这个迭代器来操作该集合内的元素,否则会出现异常。为什么呢?以下是楼主的个人理解:因为在使用其他类的方法来操作遍历中的元素时,若出现增加删除等操作,将会改变角标,而这时迭代器并不知道改变所以会出现安全隐患,所以直接就禁止使用非迭代器的方法在迭代器进行迭代时改变元素。

以下是代码,假设需要移除保存了字符串的ArrayList集合al中所有值为str的字符串则定义了一个方法:
private static void myremove(ArrayList<String> al,String str)
        {
                /*错误方法:使用集合的删除方法来删除
               for(Iterator<String> it=al.iterator();it.hasNext();)
                {
                        String s=it.next();
                        if(str.equals(s))
                        {
                                al.remove();/将会报异常。
                        }

                 */
                /*方法一:不遍历,使用集合本身的方法来删除
                        if(al.contains(str))
                                al.remove(str);
                */
               
                /*
                 * 方法2:创建一个新集合,存入不想删除的元素,最后返回该集合。PS:应把前面void改为ArrayList<String>
                ArrayList<String> a=new ArrayList<String>();
                for(ListIterator<String> it=al.listIterator();it.hasNext();)
                {
                        String s=it.next();
                        if(!str.equals(s))
                        {
                                a.add(s);
                        }
                }
                return a;
                */
               
                //方法三:使用迭代器的删除方法来删除
                for(Iterator<String> it=al.iterator();it.hasNext();)
                {
                        String s=it.next();
                        if(str.equals(s))
                        {
                                it.remove();//用迭代器遍历时只能使用迭代器的方法操作元素,否则会出现异常。
                        }
                }


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

2 个回复

正序浏览
还不错,征用了
回复 使用道具 举报
真是悲伤,用写代码功能粘贴的代码显示不了。。只能直接写了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马