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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘德坤 中级黑马   /  2015-10-8 22:29  /  600 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima;

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

/*
* 3、 一个ArrayList对象aList中存有若干个字符串元素,
*  现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素,
*  请用代码实现。
* */
@SuppressWarnings("unused")
public class Test17 {
        public static void main(String[] args) {
                List<String> aList = new ArrayList<String>();
                aList.add("CSDN社区");
                aList.add("abc");
                aList.add("黑马程序员");
                aList.add("黑马论坛");
                aList.add("黑马程序员——安卓");
                aList.add("黑马程序员——云计算");
                aList.add("abc");
                aList.add("我准备去黑马训练营了");
        //解决办法,通过传统for循环的角标删除对应的元素
                for(int i=0;i<aList.size();i++){
                        if(aList.get(i).equals("abc")){
                                aList.remove(i);
                        }
                }
                System.out.println(aList);
               
                /**
                 * 如果使用增强for循环,那么将会报告java.util.ConcurrentModificationException
                 * 为什么会报告这个错误呢?
                 * 增强for循环底层调用的是Iterator迭代器的hasNext方法和next方法,因为ArrayList本身是一个固定长度的集合,
                 * 如果在迭代的时候对数据进行增删操作,那么将会引发异常。这是为什么呢?
                 *
                 * 增强for循环和Iterator遍历的效果是一样的,
                 * 也就说增强for循环的内部也就是调用Iteratoer实现的,
                 * 但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。迭代器也是一样。
                 * */
               
       
                /*for(String str :aList){//aList的size现在是8
                        System.out.println(aList.size());
                        //第一次没有删除,size还是8,第二次打印的还是8。
                        if(str.equals("abc")){
                                //但是由于判断到了迭代到的元素是abc,那么删除。
                                aList.remove(str);//删除元素,这时就发生了java.util.ConcurrentModificationException
                        }
                }
                System.out.println(aList);*/
               
        //解决办法:创建一个新的集合,把要删除的元素存储进新的集合
                /*List <String> delList = new ArrayList();
                for(String str :aList){
                        if(str.equals("abc")){
                                delList.add(str);
                        }
                }
                System.out.println(aList);//原集合
                aList.removeAll(delList);
                System.out.println(aList);//删除后的集合*/               
       
        //下面迭代器其原理跟增强for循环一样
                //会发送java.util.ConcurrentModificationException异常
                /*Iterator<String> it = aList.iterator();
                while(it.hasNext()){
                        String str = it.next();
                        if(str.equals("abc")){
                                aList.remove(str);
                        }
                }
                System.out.println(aList);*/
               
                /*List<String> delList = new ArrayList<String>();
                Iterator<String> it = aList.iterator();
                while (it.hasNext()) {
                        String str = it.next();
                        if(str.equals("abc")){
                                delList.add(str);
                        }
                }
                System.out.println(aList);//原集合
                aList.removeAll(delList);
                System.out.println(aList);//删除后的集合*/               
        }
}

1 个回复

倒序浏览
顶,相互学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马