本篇文章将学习到:

1. java.util.ConcurrentModificationException: null出现原因及解决办法(附带案例)

2. List的三种遍历方式

3. List的解析(新手向)

4.如何选择集合实现类


ConcurrentModificationException

出现问题

在使用List集合的时候出现了如下报错:

 定位代码:

 

出现原因

报错解释:“ConcurrentModificationException是基于java集合中的快速失败(fail-fast)机制产生的,在使用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了增删改,就会抛出该异常。”

当我们迭代一个ArrayList或者HashMap时,如果尝试对集合做一些修改操作(例如删除元素),可能会抛出java.util.ConcurrentModificationException的异常。

解决办法

  • 方法一:不要在增强for循环中增删数据
  • 方法二:使用索引(普通for循环)遍历。
  • 方法三:使用增强for循环遍历,增删操作使用迭代器实现。

List遍历的三种方法

  1. 使用普通for
  2. 使用增强for
  3. 使用iterator

代码实现:

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

        // 添加元素 1-10
        for (int i = 1; i < 11;i++){
            list.add(i);
        }

        System.out.println(list);
        System.out.println("------------------------------------");


        // List遍历的三种方式
        //1. for循环
        System.out.println("====for循环遍历");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");
        }
        //2. 增强for循环
        System.out.println( );
        System.out.println("====增强for循环遍历");
        for (Object o : list) {
            System.out.print(o+" ");
        }
        //3. 迭代器
        System.out.println( );
        System.out.println("====迭代器遍历");
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.print(next+" ");
        }



    }

打印结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
------------------------------------
====for循环遍历
1 2 3 4 5 6 7 8 9 10 
====增强for循环遍历
1 2 3 4 5 6 7 8 9 10 
====迭代器遍历
1 2 3 4 5 6 7 8 9 10 

List的解析 

集合主要是两组:单列集合 和 双列集合

collection接口有两个重要接口 List 和 Set,它们的实现子类是单列集合

 

 

List接口是Collection接口的子接口

  1. List接口类中元素有序(添加顺序和取出顺序一致),且可重复

  2. List集合中的每个元素都有其对应的顺序索引

  3. List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素

  4. JDK API 中List接口的实现类 AbstractListAbstractSequentialListArrayListAttributeListCopyOnWriteArrayListLinkedListRoleListRoleUnresolvedListStackVector

    主要类:ArrayList、LinkedList、Vector

如何选择集合的实现类

1. 先判断存储的类型(一组对象或一组键值对)
2. 一组对象Collection接口
       允许重复:List
             增删多:LinkedList(底层维护了一个双向链表)
             改查多:ArrayList(底层维护Object类型的可变数组)
           不允许重复:Set
             无序:HashSet(底层是HashMap,维护了一个哈希表,即数组+链表+红黑树)
             排序:TreeSet
             插入和取顺序一致:LinkedHashSet(维护数组+双向链表)


3.一组键值对Map
            键无序:HashMap(底层是:哈希表 jdk7:数组+链表  jdk8:数组+链表+红黑树)
            键排序:TreeMap
            键插入和取出顺序一样:LinkedHashMap
            读取文件:Properties

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐