List

ArrayList

构造函数

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else {
            if (initialCapacity != 0) {
                throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
            }

            this.elementData = EMPTY_ELEMENTDATA;
        }

    }

    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

指定大小初始化或者默认以10初始化数组

add 方法

add操作前判断是否进行扩容 size+1 modCount成員變量記錄着集合的修改次数,也就每次add或者remove它的值都会加1 保证在Iterator遍历集合时无法进行remove,add等操作。 最终调用的扩容代码

序列化

由于 ArrayList 是基于动态数组实现的,所以并不是所有的空间都被使用。 因此使用了 transient 修饰,可以防止被自动序列化。重写writeObject方法

ConcurrentModificationException 出现原因

modCount

expectedModCount

  • 该值表示对List的修改次数,查看ArrayList的add()和remove()方法

  • 每次调用add()方法或者remove()方法就会对modCount进行加1操作。

  • 在 Iterator中 中的hasNext方法的第一句都会有checkForComodification()

    如果 modCount != expectedModCount 就会出现上面异常

  • iterator.remove();在循环中调用时并不会出错

Last updated

Was this helpful?