ArrayList函数

这篇博客详细介绍了ArrayList的一些关键函数,包括trimToSize()、size()、isEmpty()、contains()、indexOf()、lastIndexOf()、clone()、toArray()、get()、rangeCheck()、removeAll()以及迭代操作如forEach()和sort()。内容涵盖了这些函数的作用、实现逻辑和使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 、trimToSize()函数
该函数是将ArrayList实例的容量修建为列表实际的大小。也就是去除掉所有得空格

public void trimToSize() {
    modCount++;
    if (size < elementData.length) {
        elementData = (size == 0)
          ? EMPTY_ELEMENTDATA
          : Arrays.copyOf(elementData, size);
    }
}

2、size()函数
返回该列表真实的保存的数据的长度。

public int size() {
        return size;
    }

3、 isEmpty()函数
该函数用于判断列表是否为空,其直接判断列表长度是否为0即可。

public boolean isEmpty() {
        return size == 0;
    }

4、contains(Object o)函数
该函数用于判断该列表中是否包含指定的元素。其实现如下:

public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

该函数调用indexOf()函数直接判断其返回值是否大于等于0。下面,我们看一下indexOf函数的实现。

5、indexOf(Object o)函数
该函数返回列表中包含元素o的第一个位置,如果元素不存在,返回-1。

public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

我们很明显的看到,在这里程序将对象o进行了判断,是否为null。因为其判等的方式是不同的,如果为null,直接可以使用等号进行判断;如果不为null,则需要使用equals进行判断。

6、lastIndexOf(Object o)函数
该函数与上述函数正好相反,返回列表中包含对象o的最后一个位置。其实现逻辑与indexOf()函数也类似,不过就是倒序遍历既可以。

 public int lastIndexOf(Object o) {
        if (o == null) {
            for (int i = size-1; i >= 0; i--)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = size-1; i >= 0; i--)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

7、clone()函数
该函数实现列表的拷贝。

public Object clone() {
        try {
            ArrayList<?> v = (ArrayList<?>) super.clone();
            v.elementData = Arrays.copyOf(elementData, size);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }

其调用父类的clone()函数,然后拷贝数组列表,并将modCount改为0,生成的列表便是一个新的列表。

8、toArray()函数
将列表转换为对象数组。而在ArrayList中,实现了两个toArray()函数,我们看一下他们两个的返回值。

public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }
    
public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

很明显,我们可以看到,无参数的toArray()函数返回的是对象列表,而有参数的toArray()函数返回的是指定类型的对象列表。

9、get(int index)函数
该函数是用户可调用的,用于返回指定的位置的元素。

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

函数实现中,首先对传入的index参数做一个范围判断,如果校验成功,则返回指定位置的元素信息。

10、 rangeCheck(int index)函数

private void rangeCheckForAdd(int index) {
        if (index > size || index < 0)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    }

该函数用于对用户传入的指定位置信息进行范围判定,如果超出列表的实际长度或小于0,则抛出IndexOutOfBoundsException。

11、removeAll(Collection<?> c)函数

public boolean removeAll(Collection<?> c) {
        Objects.requireNonNull(c);
        return batchRemove(c, false);
        //batchRemove函数是批量移除元素的
    }

该函数用于移除列表中包含集合c中元素的所有元素。通过函数体可以看出,首先系统判断了集合c是否为空,如果为空,则抛出空指针错误。

12、分割迭代。将集合中的元素分裂成多个迭代器对象返回
public Spliterator spliterator() {
return new ArrayListSpliterator<>(this, 0, -1, 0);
}

13、以迭代的方式逐一去操作集合元素
public void forEach(Consumer<? super E> action) 方法

14、以参数提供的比较器对集合中的元素进行排序
public void sort(Comparator<? super E> c) {…}

ArrayList函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值