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) {…}