对源码中的注释进行翻译解读,源码注释需查阅源码
一、ArrayList
1.增
将指定的元素追加到此列表的末尾
参数 | e | 将要添加到此列表的元素 |
返回 | boolean | as specified by {@link Collection#add} |
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
将指定的元素插入到此列表中的指定位置。将当前位置的元素(如果有的话)和随后的元素向右移动(给它们的下标加1)。
参数 参数 | index | 将要添加到此列表的元素的索引 |
element | 将要插入的元素 | |
抛出 | 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++;
}
这里研究一个方法java.lang.System.arraycopy()方法,方法注释翻译如下:
从指定的位置开始,将数组从指定的源数组复制到目标数组的指定位置。将数组组件的子序列从src引用的源数组复制到dest引用的目标数组。复制的组件数量等于参数length。将源数组中位置为srcPos到srcPos+length-1的组件分别复制到目标阵列位置为destPos到destPos+length-1的组件。
如果src和dest参数引用同一个数组对象,然后执行复制,如果组件位置通过srcPos srcPos +长度是1第一次被复制到一个临时数组长度为组件,然后临时数组的内容复制到职位destPos通过destPos +目标数组的长度是1。
如果dest为空,则抛出NullPointerException。
如果src为空,则抛出NullPointerException,并且不修改目标数组。
另外,如果以下任一项为真,就会抛出一个ArrayStoreException并且不修改目标:
- src参数引用的对象不是数组。
- dest参数引用的对象不是数组。
- src参数和dest参数指的是组件类型为不同基元类型的数组。
- src参数指向一个具有基元组件类型的数组,dest参数指向一个具有引用组件类型的数组。
- src参数指向一个具有引用组件类型的数组,dest参数指向一个具有基元组件类型的数组。
另外,如果以下任一项为真,则抛出IndexOutOfBoundsException异常,且不修改目标:
- srcPos参数为负值。
- destPos是负的。
- length参数是负的。
- srcPos+length大于src。Length,源数组的长度。
- destPos+length大于目标数组的长度dest.length。
另外,如果源数组中从位置srcPos到srcPos+length-1的任何实际组件不能通过赋值转换转换为目标数组的组件类型,则会抛出ArrayStoreException。在本例中,设k是小于长度的最小的非负整数,使src[srcPos+k]不能转换为目标数组的组件类型;当抛出异常时,从位置srcPos到srcPos+k-1的源数组组件将已经通过destPos+k-1复制到目标数组位置destPos,并且目标数组的其他位置将不会被修改。(由于已经列出的限制,这一段实际上只适用于两个数组都具有引用类型的组件类型的情况。)
参数 | src | 源数组 |
srcPos | 源数组的起始位置 | |
dest | 目标数组 | |
destPos | 目标数据的起始位置 | |
length | 要复制的数组元素的数量 | |
抛出 | IndexOutOfBoundsException | 如果复制会导致访问数组边界外的数据 |
ArrayStoreException | 如果src数组中的元素因为类型不匹配而不能存储到dest数组中 | |
NullPointerException | src或dest为空 |
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
2.删
移除该列表中指定位置的元素。
将所有后续的元素向左移动(从它们的指数中减去1)
参数 | index | 要删除的元素的索引 |
返回 | 从列表中删除的元素 | |
抛出 | @throws IndexOutOfBoundsException {@inheritDoc} |
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
如果指定元素存在,则从该列表中删除该元素的第一个匹配项。如果列表中不包含该元素,则该元素不变。更正式地说,删除索引i最低的元素,这样(o==null ?Get (i)==null: o.equals(Get (i)))(如果存在这样的元素)。如果该列表包含指定的元素,则返回true(或者,如果该列表因调用而发生更改,则返回true)。
参数 | o | 元素,如果存在,则从列表中删除 |
返回 | 如果此列表包含指定的元素,则为true |
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
3. 改
将此列表中指定位置的元素替换为指定的元素。
参数 | Index | 要替换的元素的索引 |
element | 存储在指定位置的元素 | |
返回 | 先前位于指定位置的元素 | |
抛出 | IndexOutOfBoundsException |
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
4. 查
返回列表中指定位置的元素。
参数 | index | 要返回的元素的索引 |
返回 | E | 位于列表中指定位置的元素 |
抛出 | IndexOutOfBoundsException |
public E get(int index) {
rangeCheck(index);
return elementData(index);
}