publicintindexOf(Object o) { if (o == null) {//如果传入的参数是null,则循环遍历数组,找到第一个为null的值,返回它的索引 for (inti=0; i < size; i++) if (elementData[i]==null) return i; } else {//否则,遍历数组,查看两个对象是否相等;比对时需要注意equals方法有没有被重写 for (inti=0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1;//如果数组中找不到该值,则返回-1 }
返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含元素,则返回 -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; }
public Object[] toArray() { return Arrays.copyOf(elementData, size); }
转化为对象数组,数组中元素顺序和在列表中时一致;重写分配了内存空间,修改该数组不影响原列表;
需要注意的是,这里仍为浅拷贝,修改元素的内容,会影响原列表中元素的内容
1 2 3 4 5 6 7 8 9 10
@SuppressWarnings("unchecked") 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; }
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组
获取指定位置的元素
1 2 3 4 5 6 7 8 9 10
@SuppressWarnings("unchecked") E elementData(int index) { return (E) elementData[index]; }
public E get(int index) { rangeCheck(index);//检查传入的索引参数是否超出列表的最大长度,如果超出,抛出越界异常IndexOutOfBoundsException return elementData(index); }
设值
1 2 3 4 5 6 7
public E set(int index, E element) { rangeCheck(index); EoldValue= elementData(index); elementData[index] = element; return oldValue; }
intnumMoved= size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // 将数组中最后一个位置的元素置空,使垃圾回收起效,此处可做参考
return oldValue; }
从列表中指定位置移除某个元素,列表的capacity容量不变,但是size减1
该方法返回移除的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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; }
移除列表中第一个对象o,成功返回true
1 2 3 4 5 6 7
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 }
privatevoidwriteObject(java.io.ObjectOutputStream s) throws java.io.IOException{ // Write out element count, and any hidden stuff intexpectedModCount= modCount; s.defaultWriteObject();
// Write out size as capacity for behavioural compatibility with clone() s.writeInt(size);
// Write out all elements in the proper order. for (int i=0; i<size; i++) { s.writeObject(elementData[i]); }
if (modCount != expectedModCount) { //防止在ArrayList对象序列化期间修改了ArrayList thrownewConcurrentModificationException(); } }