`

ArrayList中的add(index, element)方法分析

阅读更多

问题引入:今天在使用ArrayList的add(index, element)方法向list中插入数据的时候出现数组越界异常,感觉很奇怪,list不是支持动态扩展的吗?为什么会出现越界的情况呢?

 

有了问题,当然要首先查看JDK源码咯:

 

/**
     * Inserts the specified element at the specified position in this
     * list. Shifts the element currently at that position (if any) and
     * any subsequent elements to the right (adds one to their indices).
     *
     * @param index index at which the specified element is to be inserted
     * @param element element to be inserted
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
    }
   /**
     * A version of rangeCheck used by add and addAll.
     */
    private void rangeCheckForAdd(int index) {
        if (index > size || index < 0)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }

 源码中一目了然,在往list中插入数据之前会先对你插入的位置作检查,插入的位置只能是[0, list.size()],


 

另外要说明的是,这个size在ArrayList中的定义是:

 

   /**

     * The size of the ArrayList (the number of elements it contains).

     * @serial

     */

    private int size;

即list实际包含元素的个数。目前为止我们还只是知道了JDK中就是这样设计的,但是为什么这样设计:为什么插入元素的位置不能是大于size呢?

 

以下是个人理解:

前面已经知道了size是表示list中实际包含的元素的个数,并且,在调用add方法成功往list添加元素的时候size会加1,在调用remove方法成功从list中删除一个数据的时候size会减1。 

那么如果支持向大于size中插入数据,那么插入成功之后会将size++,但是实际上list实际要维护的list的元素个数就不只是size了。

假如原来list中有3个元素,对应的存储位置是0,1,2,现在我向第5个位置插入数据,那么成功之后size大小变为4;但是3、4位置上的元素是什么呢?我使用下标遍历list的时候怎么知道这个位置有没有元素呢?所以这势必会导致很多问题出现,所以对插入位置进行检查是有意义的。

 

 

 

  • 大小: 8 KB
分享到:
评论

相关推荐

    Java ArrayList.add 的实现方法

    Java ArrayList 是一种常用的 List 实现, 其中 boolean add(E e) 方法和 void add(int index, E element) 方法是两个重要的实现方法。下面我们将详细介绍这两个方法的实现细节。 首先,我们来看 boolean add(E e) ...

    java ArrayList的使用与分析

    【Java ArrayList 使用与分析】 ArrayList 是 Java 集合框架中的一个重要组成部分,它是一个基于数组实现的可变大小的列表。ArrayList 类继承自 AbstractList 类并实现了 List 接口,这意味着它可以被用作一个有序...

    JavaScript 实现基础 ArrayList 功能

    在JavaScript中,ArrayList是一种常见的数据结构,它模拟了Java中的...以上就是在JavaScript中实现基础ArrayList功能的方法,虽然没有参数重载,但通过巧妙的编程技巧,依然可以实现灵活且功能齐全的数据结构。

    Java ArrayList add(int index, E element)和set(int index, E element)两个方法的说明

    了解这些细节后,我们可以更好地理解和使用ArrayList的`add(int index, E element)`和`set(int index, E element)`方法,避免在编程过程中出现预期之外的结果。在处理ArrayList时,务必确保对索引的操作在合法范围内...

    试谈Java中ArrayList类的使用.pdf

    * `add(int index, E element)`: 将指定的元素插入 ArrayList 的指定位置。 删除元素 ArrayList 类提供了三种删除元素的方法: * `remove(int index)`: 移除 ArrayList 中指定位置上的元素。 * `remove(Object o)...

    ArrayList类操作程序实例

    2. `add(int index, E element)`:在指定位置插入一个元素,其余元素依次后移。 三、删除元素 1. `remove(int index)`:删除指定索引处的元素,后续元素前移。 2. `remove(Object o)`:删除首次出现的指定元素。 ...

    深入Java集合学习系列(三):ArrayList实现原理

    set(int index, E element)方法用于替换指定位置上的元素,而addAll(Collection&lt;? extends E&gt; c)和addAll(int index, Collection&lt;? extends E&gt; c)方法则用于添加整个集合中的元素。 在扩容操作中,ensureCapacity...

    ArrayList集合工具类

    - `add(int index, E element)`: 在指定位置插入一个元素。 - `get(int index)`: 返回指定位置的元素。 - `set(int index, E element)`: 替换指定位置的元素。 - `remove(int index)`: 删除指定位置的元素。 - ...

    arraylist使用方法

    `AddPlayer`方法用于向对应的ArrayList中添加演员,`ShowAll`方法则可能用于遍历并展示所有演员的表演方式。这展示了如何在实际项目中利用ArrayList来管理和操作自定义类型的数据。 总结来说,ArrayList在Java中是...

    c版的arraylist

    3. **添加元素**:`add`方法用于在`ArrayList`末尾添加元素。当数组满时,需要进行扩容操作。 ```c void arrayListAdd(ArrayList *list, void *element); ``` 4. **插入元素**:可能还需要一个`insert`方法,在...

    数组模仿ArrayList

    此外,我们还需要提供修改元素的`set(int index, T element)`、获取元素数量的`size()`、清空列表的`clear()`等方法,以实现ArrayList的基本功能。 ```java public T set(int index, T element) { rangeCheck...

    有关于C#的程序(ArrayList类,动态添加,删除的)

    在C#编程语言中,ArrayList类是System.Collections命名空间下的一个重要的数据结构,它提供...通过分析这些文件,你可以学习到ArrayList的实践应用,了解如何在C#中实现动态添加和删除元素,以及如何组织和管理C#项目。

    模拟java ArrayList Iterator

    在Java中,ArrayList类继承自AbstractList接口,并实现了List接口,提供了丰富的操作方法,如add、remove、get等。 Iterator设计模式是一种行为设计模式,它的主要作用是为集合提供一种顺序访问元素的方式,而无需...

    ArrayList演示

    在实际开发中,根据需求选择合适的方法使用ArrayList,可以提高代码的效率和可读性。 最后,值得注意的是ArrayList与LinkedList之间的区别。LinkedList提供了更快的插入和删除速度,但访问元素的速度较慢,因为它...

    Java基础-ArrayList方法全解(上).pdf

    - addAll(int index, Collection&lt;? extends E&gt; c): 在指定索引位置开始,将集合中的所有元素依次插入到ArrayList中。 4. 访问和修改元素 - get(int index): 返回指定索引处的元素。 - set(int index, E element)...

    学生管理系统(使用ArrayList)

    1. 添加学生:调用ArrayList的`add()`方法,将新学生对象添加到列表中。 2. 查找学生:使用`indexOf()`或遍历列表,根据特定条件(如学号)查找学生。 3. 更新学生信息:通过索引调用`set()`方法,修改指定学生的...

    ArrayList数据结构的分析

    `add(int index, E element)`则允许在指定位置插入元素,此时需要移动后续元素,时间复杂度为O(n-index)。 3. **删除元素**: `remove(int index)`方法会删除指定索引处的元素,并将后面的所有元素向前移动一位。...

    ArrayList的实现原理

    - **add(int index, E element)**:在指定位置插入元素,需要时也会扩容,并将后续元素依次向后移动。 - **addAll方法**:将整个Collection或部分Collection的元素添加到ArrayList,可以指定插入位置,同样可能...

    JAVA提高第十篇 ArrayList深入分析

    此外,`add(int index, E element)`方法允许在指定位置插入元素。 2. 删除元素:`remove(Object o)`根据对象的equals()方法移除第一个匹配的元素;`remove(int index)`移除指定位置的元素。 3. 查询:`get(int index...

    java中ArrayList的用法

    ### Java中ArrayList的用法详解 #### 一、概述 `ArrayList`是Java集合框架中的一个动态数组类,它能够存储任意类型的对象,并且在运行时动态调整其大小。这使得`ArrayList`成为处理数量未知的数据集合时的一个非常...

Global site tag (gtag.js) - Google Analytics