// 正向查找,返回元素的索引值 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; } return -1; }
// 反向查找,返回元素的索引值 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; }
// 反向查找(从数组末尾向开始查找),返回元素(o)的索引值 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; }
// 返回ArrayList的Object数组 public Object[] toArray() { return Arrays.copyOf(elementData, size); }
// 返回ArrayList的模板数组。所谓模板数组,即可以将T设为任意的数据类型 public <T> T[] toArray(T[] a) { // 若数组a的大小 < ArrayList的元素个数; // 则新建一个T[]数组,数组大小是“ArrayList的元素个数”,并将“ArrayList”全部拷贝到新数组中 if (a.length < size) return (T[]) Arrays.copyOf(elementData, size, a.getClass());
// 删除ArrayList指定位置的元素 public E remove(int index) { RangeCheck(index);
modCount++; EoldValue= (E) elementData[index];
intnumMoved= size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work
return oldValue; }
// 删除ArrayList的指定元素 publicbooleanremove(Object o) { if (o == null) { for (intindex=0; index < size; index++) if (elementData[index] == null) { fastRemove(index); returntrue; } } else { for (intindex=0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); returntrue; } } returnfalse; }
// 快速删除第index个元素 privatevoidfastRemove(int index) { modCount++; intnumMoved= size - index - 1; // 从"index+1"开始,用后面的元素替换前面的元素。 if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); // 将最后一个元素设为null elementData[--size] = null; // Let gc do its work }
// 删除元素 publicbooleanremove(Object o) { if (o == null) { for (intindex=0; index < size; index++) if (elementData[index] == null) { fastRemove(index); returntrue; } } else { // 便利ArrayList,找到“元素o”,则删除,并返回true。 for (intindex=0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); returntrue; } } returnfalse; }
// 克隆函数 public Object clone() { try { ArrayList<E> v = (ArrayList<E>) super.clone(); // 将当前ArrayList的全部元素拷贝到v中 v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable thrownewInternalError(); } }
// java.io.Serializable的写入函数 // 将ArrayList的“容量,所有的元素值”都写入到输出流中 privatevoidwriteObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff intexpectedModCount= modCount; s.defaultWriteObject();
// 写入“数组的容量” s.writeInt(elementData.length);
// 写入“数组的每一个元素” for (int i=0; i<size; i++) s.writeObject(elementData[i]);
if (modCount != expectedModCount) { thrownewConcurrentModificationException(); }
}
// java.io.Serializable的读取函数:根据写入方式读出 // 先将ArrayList的“容量”读出,然后将“所有的元素值”读出 privatevoidreadObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in size, and any hidden stuff s.defaultReadObject();
// 从输入流中读取ArrayList的“容量” intarrayLength= s.readInt(); Object[] a = elementData = newObject[arrayLength];