精华内容
下载资源
问答
  • public static void listIterator3(){ List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); list.add(3); list.add(4); Iterator<... }
  • Java 遍历集合删除元素

    千次阅读 2018-08-03 17:08:05
    Java 遍历集合删除元素? 问题及分析 正确删除集合元素 问题及分析 注:在浏览阿里巴巴Java开发手册时,自己测试Java遍历集合并删除元素时发现有些巧合以及总结 先写开发手册里一个例子,大家猜一下以下...
    • 问题及分析
    • 正确删除集合元素

    问题及分析

    注:在浏览阿里巴巴Java开发手册时,自己测试Java遍历集合并删除元素时发现有些巧合以及总结

    先写开发手册里一个例子,大家猜一下以下代码的输出

    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    
    System.out.println("list original size is " + list.size());
    
    for (String item : list) {
        if ("1".equals(item)) {
            list.remove(item);
        }
    }
    
    System.out.println("list size is " + list.size());
    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    
    System.out.println("list original size is " + list.size());
    
    for (String item : list) {
        if ("1".equals(item)) {
            list.remove(item);
        }
    }
    
    System.out.println("list size is " + list.size());

    上面两个例子的输出结果是什么?意外吗?
    1,2可以成功;1, 2, 3删除抛出异常

    • 第一个:
      list original size is 2
      list size is 1
    • 第二个:
      list original size is 3
      java.util.ConcurrentModificationException

    我们可以看一下此处代码的反编译代码:

    List<String> list = new ArrayList();
    list.add("1");
    list.add("2");
    // list.add("3");
    System.out.println("list original size is " + list.size());
    Iterator var2 = list.iterator();
    
    while(var2.hasNext()) {
        String item = (String)var2.next();
            if ("1".equals(item)) {
                list.remove(item);
            }
    }
    
    System.out.println("list size is " + list.size());

    通过查看反编译代码,发现我们使用的foreach遍历仍然是迭代器Iterator遍历,而ArrayList中Iterator源码:

     private class Itr implements Iterator<E> {
         int cursor;       // index of next element to return
         int lastRet = -1; // index of last element returned; -1 if no such
         int expectedModCount = modCount;
    
         Itr() {}
    
         public boolean hasNext() {
             return cursor != size;   // 游标
         }
    
         @SuppressWarnings("unchecked")
         public E next() {
             checkForComodification();   // 检查是否并发修改
             int i = cursor;
             if (i >= size)
                 throw new NoSuchElementException();
             Object[] elementData = ArrayList.this.elementData;
             if (i >= elementData.length)
                 throw new ConcurrentModificationException();
             cursor = i + 1;  // 游标后移
             return (E) elementData[lastRet = i];
         }
    
         public void remove() {
             if (lastRet < 0)
                 throw new IllegalStateException();
             checkForComodification();
    
             try {
                 ArrayList.this.remove(lastRet);
                 cursor = lastRet;
                 lastRet = -1;
                 expectedModCount = modCount;   // 修改预期值(迭代器删除的重要参考)
             } catch (IndexOutOfBoundsException ex) {
                 throw new ConcurrentModificationException();
             }
         }
         ......
      }
    

    modCount是集合添加,删除等改变集合结构的次数(改变集合大小),expectedModCount是预期的变化次数;
    分析一下:
    [“1”, “2”] : 当”1”被遍历删除后,游标cursor的值从0变为1,集合长度也变为1,这是hasNext返回false,比较表示没有下一个元素,结束遍历;
    [“1”, “2”, “3”] : 如上,当”1”遍历删除后,游标cursor从0变为1,集合长度变为2,hasNext返回true,执行remove时,checkForComodification()方法验证是否同时修改,此方法表modCount != expectedModCount,modCount是3,expectedModCount也是3,而在删除后modCount变为4,而hasNext()方法不返回false,next()方法调用时就会抛出异常;
    注:由其游标变化规律可以看出,如果hasNext提前结束,不执行后面的next取数据,就可以删除集合元素,故可以删除集合中倒数第二个元素而不抛出异常(实践也如此)


    正确删除集合元素

    • 迭代器方式
     public void positiveForEachTest() {
          List<String> list = new ArrayList<>();
          list.add("w");
          list.add("li");
          list.add("z");
    
          System.out.println("list original size is " + list.size());
    
          Iterator<String> iterator = list.iterator();
          while (iterator.hasNext()) {
              String item = iterator.next();
              if ("li".equals(item)) {
                  iterator.remove();
              }
          }
    
          System.out.println("after list remove elem `li`, it's size is " + list.size());
      }
    展开全文
  • java集合删除指定元素

    千次阅读 2017-07-03 17:16:43
    题目:一个ArrayList对象... 现在遍历该ArrayList对象,删除其中所有值为abc的字符串元素。 思路:1.创建ArrayList对象  2.添加元素  3.遍历元素删除指定字符串元素  public class TestArraylist1 {  public st
    题目:一个ArrayList对象aList中有若干个字符串元素,
               现在遍历该ArrayList对象,删除其中所有值为abc的字符串元素。

    思路:1.创建ArrayList对象
                2.添加元素
                3.遍历元素,删除指定字符串元素

     public class TestArraylist1 {
         public static void main(String[] args) {
    ArrayList al=new ArrayList();
    al.add("12");
    al.add("abc");
    al.add("abc");
    al.add("aa");
    al.add("abc");
    al.add(new Date());

    ArrayList al1=new ArrayList();//用来装需要删除的元素
    Iterator iterator=al.iterator();

    while(iterator.hasNext()){
    Object obj=iterator.next();
    if(obj.equals("abc")){
    al1.add(obj);//遍历集合,把所有字符串"abc"放到另一个字符串
    }
    }

    al.removeAll(al1);//遍历完成后执行删除
    System.out.println(al);
    }
    }

    注意:如果在对一个List进行遍历的时候将其中的元素删除掉,就会出现ConcurrentModificationException                                                                                       异常解决办法如上:可以先将要删除的元素用另一个list装起来,等遍历结束再remove掉



    展开全文
  • java集合遍历删除元素

    千次阅读 2019-06-17 15:48:57
    java集合遍历删除的几种方式 1、for循环遍历list for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")) list.remove(i); } 这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的...

    java集合遍历删除的几种方式

    1、for循环遍历list

    for(int i=0;i<list.size();i++){    
        if(list.get(i).equals("del"))
            list.remove(i);
    }
    

    这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。

    2、增强for循环

    for(String ele:list){    
            if(x.equals("del"))
                list.remove(ele);
    }
    

    这种方式的问题在于,删除元素后继续循环会报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出。但是删除完毕马上使用break跳出,则不会触发报错。

    3、iterator遍历

    Iterator<String> it = list.iterator();
    	while(it.hasNext()){
            String x = it.next();    
            while(it.hasnext()){
            if(x.equals("del")){
                it.remove();
            }
    }
    

    这种方式可以正常的循环及删除。但要注意的是,使用iterator的remove方法,如果用list的remove方法同样会报上面提到的ConcurrentModificationException错误。

    	public List<AcFunction> getMenusMarkFavorite(loginProfile prof) {
    		List<AcFunction> menusMarkFavorites = acRoleFunctionService.getMenusMarkFavorite(prof);
    		for (AcFunction menusMarkFavorite : menusMarkFavorites) {
    			if ("FTN_AMD_BASE_DATA_MGT".equals(menusMarkFavorite.getFtn_ext_id())){
    				menusMarkFavorites.remove(menusMarkFavorite);
    				break;
    			}
    		}
    		return menusMarkFavorites ;
    	}
    
    public List<AcFunction> getMenusMarkFavorite(loginProfile prof) {
    		List<AcFunction> menusMarkFavorites = acRoleFunctionService.getMenusMarkFavorite(prof);
    		Iterator<AcFunction> iterator = menusMarkFavorites.iterator();
    		while (iterator.hasNext()) {
    			AcFunction menusMarkFavorite =  iterator.next();
    			//删除多个
    			if ("BASE_DATA_MGT".equals(menusMarkFavorite.getFtn_ext_id()) || "CPT_D_MGT".equals(menusMarkFavorite.getFtn_ext_id())){
    				iterator.remove();
    			}
    		}
    		return menusMarkFavorites ;
    	}
    
    1. foreach遍历使用remove(object);注意使用break:中断不然会报java.util.ConcurrentModificationException
    2. 直接使用迭代器,删除时直接使用remove移除即可

    总结:

    (1)循环删除list中特定一个元素的,可以使用三种方式中的任意一种,但在使用中要注意上面分析的各个问题。

    (2)循环删除list中多个元素的,应该使用迭代器iterator方式。

    参考文章
    https://www.cnblogs.com/snowater/p/8024776.html
    http://www.imooc.com/article/286726?block_id=tuijian_wz

    展开全文
  • (2)删除集合中字符串"def" (3)然后利用迭代器遍历集合元素并输出 两种方式实现: 代码: import java.util.ArrayList; import java.util.Iterator; import java.util.ListIterator; /** * @author...

    分析以下需求,并用代码实现:
    (1)定义List集合,存入多个字符串,其中包含三个连续的"def"
    (2)删除集合中字符串"def"
    (3)然后利用迭代器遍历集合元素并输出

    两种方式实现:
    代码:

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.ListIterator;
    
    /**
     * @author Administrator
     *	分析以下需求,并用代码实现:
    	(1)定义List集合,存入多个字符串,其中包含三个连续的"def"
    	(2)删除集合中字符串"def"
    	(3)然后利用迭代器遍历集合元素并输出
     */
    public class ListDelete {
    	
    	public static void main(String[] args) {
    		ArrayList<String> list = new ArrayList<>();
    		list.add("a");
    		list.add("d");
    		list.add("def");
    		list.add("def");
    		list.add("def");
    		list.add("def");
    		list.add("c");
    		
    		//第一种方法
    		//定义另一个集合
    		ArrayList<String> list2 = new ArrayList<>();
    		list2.add("def");
    		//求交集然后删除
    		list.removeAll(list2);
    		
    		//第二种方式
    		/*
    		Iterator<String> it = list.iterator();
    		while (it.hasNext()) {
    			String s = (String) it.next();
    			if ("def".equals(s)) {
    				it.remove();
    			}
    		}
    		*/
    //		System.out.println(list);
    		
      		//利用迭代器遍历集合元素并输出
    		Iterator<String> it = list.iterator();
    		while (it.hasNext()) {
    			Object object = (Object) it.next();
    			System.out.print(object+" ");
    		}
    		
    		
    		
    		
    		/*
    		 * 使用for循环在删除的过程中集合长度在变化,会造成遍历不完,删除不完全
    		for (int i = 0; i < list.size(); i++) {
    			if ("def".equals(list.get(i))) {
    				list.remove(i);
    			}
    			
    		}
    		*/
    		
    	}
    
    }
    
    

    结果:
    在这里插入图片描述

    展开全文
  • java中遍历集合删除元素的方法

    千次阅读 2019-04-26 14:32:27
    报错示例一: ...3、第二种遍历删除直接使用迭代器进行遍历,而且删除时使用的迭代器的删除元素方法,这个删除方法里面会对位置索引进行调整,使得迭代器在继续遍历查找下一个元素时,不会抛出异常错误。
  • java中循环遍历删除集合list中的元素 java删除集合List中的元素 一、问题描述 1、 假设有这么一个集合,代码如下: List<java.sql.Connection> connList=new ArrayList<java.sql.Connection>(10);...
  • Java集合容器面试题(2020最新版)

    万次阅读 多人点赞 2020-03-01 11:08:34
    文章目录集合容器概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些?List,Set,Map三者的区别?...Java集合的快速失败机制 “fail-fast”?怎么确保一个集合不能被修改?Collection...
  • JAVA集合(LIST,SET)中通过iterator.hasNext() 或者iterator.next()遍历集合中的数据时,如果这时候add或者remove集合中的元素,会发生ConcurrentModificationException异常. 本文简单说明一下这种现象和解决方法. ...
  • java 中List 集合删除元素

    千次阅读 2014-03-24 18:09:44
    今天做一个排班的功能;设计的时候需要实现从一个list集合删除一个object的操作; for (HumanWorkTime hwt: hwtList) {  if (hwt.getId().equals(tempId)) {  hwtList.remove(hwt);  
  • Java集合删除元素使用Iterator

    千次阅读 2017-02-10 10:24:53
    千万不要使用foreach循环,foreach循环会抛出java.util.ConcurrentModificationException异常,因为每次获取对象删除时ArrayList源码必须首先调用next()方法,foreach循环删除时没有调用next()方法。 package ...
  • java集合删除元素的两种常用方式及新手易错: 创建集合: ArrayList aList = new ArrayList(); aList.add("a"); aList.add("b"); aList.add("c"); aList.add("abc"); aList.add("abc"); aList.add(...
  • 一、list集合循环删除元素 1.通过普通的for删除删除符合条件的多个元素 for(int i=0;ilist.size();i++){ if(list.get(i).equals("del")) list.remove(i); } 上面这种方式会抛出java.lang....
  • java 集合之ArrayList集合元素重复删除

    千次阅读 2016-07-10 22:42:33
    对于ArrayList元素删除,之前有些没有注意的点,这里记录一下。1. 普通for循环删除答案一点都不意外,可是看下图(将ArrayList中重复的元素放置相邻): 原因:因为在ArrayList底层用的是数组实现,所以存储的时候...
  • java Collection集合删除某一元素方法汇总

    千次阅读 多人点赞 2016-09-13 11:22:32
    集合删除某一元素同样是很常用的操作,对了,面试中也总考察,面试官说要考察你的实际编程的能力,谁知道呢。下面总结了从集合删除某一元素的几种方法 package test; import java.text.MessageFormat; import...
  • java list集合元素删除方法小结

    千次阅读 2017-11-07 11:10:00
    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。...
  • 通常在删除Java集合中的元素时有会出现安全删除和不安全删除,本案例以list集合为例,list集合的特点:元素无序、可以出现重复的元素。下面就为大家带来一篇java中循环删除list中元素的方法总结。 安全的删除元素: ...
  • java 删除集合中的空元素

    千次阅读 2020-05-05 23:14:51
    java 删除集合中的空元素方法一方法二方法三 方法一 注:下面代码中需要注意的是Arrays.asList Arrays.asList创建的数据为定长集合集合长度在操作时是不可以改变的,不能对集合进行增删操作。 如果操作会抛异常。...
  • 一、List遍历过程中删除元素 使用索引下标遍历的方式 public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(1); list.add(2); list.add(2); ...
  • java集合超详解

    万次阅读 多人点赞 2018-08-03 21:28:15
    一、集合大纲 1.集合和数组的区别: ...2.Collection集合的方法: ...│—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全 │—————-├ ArrayList 接口...
  • Java集合框架】Queue、Deque和LinkedList的区别 LinkedList常用来表示双端队列。它的添加和删除元素的相关方法比较多,容易混淆,这里简单总结下。 add,remove,addFirst,addLast,removeFirst,removeLast,...
  • Java删除List集合中的重复元素

    千次阅读 2018-01-12 10:45:33
    Java实现删除List集合中的重复元素的方法有很多种,本文只介绍几种常用的方法。简单起见,本例中List的泛型皆为String类型,如果泛型为类,去重方法类似。 1、使用HashSet的无重复的特性,只是去重后的List不能保持...
  • 举个例子就可以了 也是网上看到的 也算个知识点吧 import java.util.ArrayList; import java.util.Iterator; public class TestList { public static void main(String
  • Java遍历集合元素

    千次阅读 2019-11-04 21:29:35
    Java遍历集合元素

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 218,759
精华内容 87,503
关键字:

java集合删除元素

java 订阅