欢迎访问宙启技术站
智能推送

add()函数向ArrayList中添加元素的方法是什么?

发布时间:2023-06-03 17:19:10

ArrayList是Java中常用的集合类之一,它可以存储一组动态大小的元素,并提供了一系列的方法来对元素进行添加、删除、修改、查询等操作。其中,添加元素是ArrayList最基本的操作之一,而add()函数就是ArrayList向集合中添加元素的方法。

add()函数的定义

在Java中,ArrayList的add()函数定义如下:

public boolean add(E e)

其中,E表示集合中元素的类型,也就是ArrayList中保存的任意类型的对象。add()函数的返回值为boolean类型,表示是否成功向集合中添加了元素。

add()函数的作用

add()函数的主要作用是向ArrayList集合中添加元素。它可以将指定的元素添加到集合的末尾,也可以指定元素插入的位置,从而实现任意位置添加元素的操作。

在ArrayList中添加元素时,可以直接调用add()函数,也可以使用addAll()函数一次性添加多个元素,或使用add(index, element)函数指定元素插入的位置,具体用法如下:

1. 直接调用add()函数添加单个元素

// 创建一个ArrayList集合

List<String> list = new ArrayList<>();

// 向集合中添加元素

list.add("Java");

list.add("C++");

list.add("Python");

上述代码中,通过调用add()函数向list集合中依次添加了三个元素:"Java"、"C++"和"Python"。由于ArrayList可以保存任意类型的对象,所以也可以将其他类型的对象添加到集合中。

2. 使用addAll()函数添加多个元素

// 创建一个ArrayList集合

List<String> list = new ArrayList<>();

// 向集合中添加多个元素

List<String> newElements = new ArrayList<>(Arrays.asList("Java", "C++", "Python"));

list.addAll(newElements);

上述代码中,先使用Arrays.asList()函数创建一个包含多个元素的列表newElements,再将其添加到list集合中。需要注意的是,addAll()函数的参数必须为一个Collection类型的对象,且泛型类型要和集合类型相同。

3. 使用add(index, element)函数指定元素插入的位置

// 创建一个ArrayList集合

List<String> list = new ArrayList<>();

// 向集合中插入元素

list.add("Java");

list.add(1, "C++");

list.add(2, "Python");

上述代码中,首先使用add()函数向list集合中添加了一个元素"Java",然后使用add(index, element)函数在指定位置插入了"Java"之外的两个元素:"C++"和"Python"。

需要注意的是,add()函数可以向集合中添加重复的元素,而且会按照添加的顺序依次排列。此外,如果在插入元素时指定的位置超出了ArrayList集合的范围,会抛出IndexOutOfBoundsException异常。因此,在使用add()函数时应该注意参数的合法性。

add()函数实现原理

在ArrayList中使用add()函数添加单个元素时,会先将元素保存到一个Object类型的数组中,然后通过ensureCapacityInternal()函数判断数组容量是否足够,如果不够则调用grow()函数扩充数组容量,然后调用System.arraycopy()函数将原来的元素复制到新的数组中,最后将新元素添加到末尾位置即可。具体实现如下:

private transient Object[] elementData;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // 判断数组容量
    elementData[size++] = e;  // 保存元素到数组中
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // 判断数组容量是否足够
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);  // 扩充数组容量
}

private void grow(int minCapacity) {
    // 计算新的数组容量
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);

    // 如果新容量还不够,则以minCapacity为基准来扩充
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;

    // 如果新容量已经超过最大容量,则抛出异常
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        throw new OutOfMemoryError();

    // 创建一个新的数组,并将原数组的元素复制到新数组中
    elementData = Arrays.copyOf(elementData, newCapacity);
}

以上代码中,elementData数组保存了所有的元素,size表示数组中实际保存的元素个数,modCount表示数组的修改次数。ensureCapacityInternal()函数用于计算数组容量,如果数组容量不足则调用grow()函数扩充数组容量。grow()函数首先计算新的数组容量,然后使用Arrays.copyOf()函数创建新的数组,并将原数组中的元素复制到新数组中。最后,add()函数将新元素添加到数组末尾位置。

在添加多个元素或指定插入位置时,add()函数的实现原理类似,只是增加了一些额外的判断和遍历操作,具体可以参考ArrayList的源码。