public E remove(int index) { rangeCheck(index); modCount++; EoldValue= elementData(index); intnumMoved= 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; }
/** * 从列表中删除指定元素的第一次出现 * 如果列表包含该元素,返回 true;否则返回 false */ publicbooleanremove(Object o) { // 当被删除元素为 null if (o == null) { for (intindex=0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return ture; } } else { // 如果不为空 for (intindex=0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return ture; } } returnfalse; }
/** * fastRemove 不检查下标,也不返回删除的元素 */ privatevoidfastRemove(int index) { modCount++; intnumMoved= size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index + 1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work }
IndexOf
第一次出现的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/** * contains 通过 indexOf 判断元素是否存在 */ publicintindexOf(Object o) { if (o == null) { for (inti=0; i < size; i++) if (elementData[i]==null) { return i; } } else { for (inti=0; i < size; i++) if (o.equals(elementData[i])) return i; } // 元素不存在则返回-1 return -1; }
最后一次出现的位置
1 2 3 4 5 6 7 8 9 10 11 12
publicintlastIndexOf(Object o) { if (o == null) { for (inti= size - 1; i >= 0; i--) if (elementData[i]==null) return i; } else { for (inti= size - 1; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1; }
EnsureCapacity
EnsureCapacity方法本质上通过扩容机制保证数组至少可以容纳当前参数的元素数量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/** * 该方法可以保证 arraylist 至少可以容纳 minCapacity 参数指定的元素数 * * @param minCapacity 所需要的最小容量 */ publicvoidensureCapacity(int minCapacity) { intminExpand= (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) // any size if not default element table ? 0 // larger than default for default empty table. It's already // supposed to be at default size. : DEFAULT_CAPACITY;
if (minCapacity > minExpand) { ensureExplicitCapacity(minCapacity); } }