问题引入:今天在使用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的时候怎么知道这个位置有没有元素呢?所以这势必会导致很多问题出现,所以对插入位置进行检查是有意义的。
相关推荐
Java ArrayList 是一种常用的 List 实现, 其中 boolean add(E e) 方法和 void add(int index, E element) 方法是两个重要的实现方法。下面我们将详细介绍这两个方法的实现细节。 首先,我们来看 boolean add(E e) ...
【Java ArrayList 使用与分析】 ArrayList 是 Java 集合框架中的一个重要组成部分,它是一个基于数组实现的可变大小的列表。ArrayList 类继承自 AbstractList 类并实现了 List 接口,这意味着它可以被用作一个有序...
在JavaScript中,ArrayList是一种常见的数据结构,它模拟了Java中的...以上就是在JavaScript中实现基础ArrayList功能的方法,虽然没有参数重载,但通过巧妙的编程技巧,依然可以实现灵活且功能齐全的数据结构。
了解这些细节后,我们可以更好地理解和使用ArrayList的`add(int index, E element)`和`set(int index, E element)`方法,避免在编程过程中出现预期之外的结果。在处理ArrayList时,务必确保对索引的操作在合法范围内...
* `add(int index, E element)`: 将指定的元素插入 ArrayList 的指定位置。 删除元素 ArrayList 类提供了三种删除元素的方法: * `remove(int index)`: 移除 ArrayList 中指定位置上的元素。 * `remove(Object o)...
2. `add(int index, E element)`:在指定位置插入一个元素,其余元素依次后移。 三、删除元素 1. `remove(int index)`:删除指定索引处的元素,后续元素前移。 2. `remove(Object o)`:删除首次出现的指定元素。 ...
set(int index, E element)方法用于替换指定位置上的元素,而addAll(Collection<? extends E> c)和addAll(int index, Collection<? extends E> c)方法则用于添加整个集合中的元素。 在扩容操作中,ensureCapacity...
- `add(int index, E element)`: 在指定位置插入一个元素。 - `get(int index)`: 返回指定位置的元素。 - `set(int index, E element)`: 替换指定位置的元素。 - `remove(int index)`: 删除指定位置的元素。 - ...
`AddPlayer`方法用于向对应的ArrayList中添加演员,`ShowAll`方法则可能用于遍历并展示所有演员的表演方式。这展示了如何在实际项目中利用ArrayList来管理和操作自定义类型的数据。 总结来说,ArrayList在Java中是...
3. **添加元素**:`add`方法用于在`ArrayList`末尾添加元素。当数组满时,需要进行扩容操作。 ```c void arrayListAdd(ArrayList *list, void *element); ``` 4. **插入元素**:可能还需要一个`insert`方法,在...
此外,我们还需要提供修改元素的`set(int index, T element)`、获取元素数量的`size()`、清空列表的`clear()`等方法,以实现ArrayList的基本功能。 ```java public T set(int index, T element) { rangeCheck...
在C#编程语言中,ArrayList类是System.Collections命名空间下的一个重要的数据结构,它提供...通过分析这些文件,你可以学习到ArrayList的实践应用,了解如何在C#中实现动态添加和删除元素,以及如何组织和管理C#项目。
在Java中,ArrayList类继承自AbstractList接口,并实现了List接口,提供了丰富的操作方法,如add、remove、get等。 Iterator设计模式是一种行为设计模式,它的主要作用是为集合提供一种顺序访问元素的方式,而无需...
在实际开发中,根据需求选择合适的方法使用ArrayList,可以提高代码的效率和可读性。 最后,值得注意的是ArrayList与LinkedList之间的区别。LinkedList提供了更快的插入和删除速度,但访问元素的速度较慢,因为它...
- addAll(int index, Collection<? extends E> c): 在指定索引位置开始,将集合中的所有元素依次插入到ArrayList中。 4. 访问和修改元素 - get(int index): 返回指定索引处的元素。 - set(int index, E element)...
1. 添加学生:调用ArrayList的`add()`方法,将新学生对象添加到列表中。 2. 查找学生:使用`indexOf()`或遍历列表,根据特定条件(如学号)查找学生。 3. 更新学生信息:通过索引调用`set()`方法,修改指定学生的...
`add(int index, E element)`则允许在指定位置插入元素,此时需要移动后续元素,时间复杂度为O(n-index)。 3. **删除元素**: `remove(int index)`方法会删除指定索引处的元素,并将后面的所有元素向前移动一位。...
- **add(int index, E element)**:在指定位置插入元素,需要时也会扩容,并将后续元素依次向后移动。 - **addAll方法**:将整个Collection或部分Collection的元素添加到ArrayList,可以指定插入位置,同样可能...
此外,`add(int index, E element)`方法允许在指定位置插入元素。 2. 删除元素:`remove(Object o)`根据对象的equals()方法移除第一个匹配的元素;`remove(int index)`移除指定位置的元素。 3. 查询:`get(int index...
### Java中ArrayList的用法详解 #### 一、概述 `ArrayList`是Java集合框架中的一个动态数组类,它能够存储任意类型的对象,并且在运行时动态调整其大小。这使得`ArrayList`成为处理数量未知的数据集合时的一个非常...