// 从前往后遍历数组,如果o为null则返回第一个null的小标,否则根据equals()返回第一个相等下标,不含有则返回-1 publicintindexOf(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; }
// 从后往前遍历 publicintlastIndexOf(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; }
// 转化为数组 public Object[] toArray() { return Arrays.copyOf(elementData, size); }
// 返回传入类型的数组,如果传入数组长度<size,创建一个新数组返回,否则会将元素复制到传入数组中 // 如果传入数组长度>size,会将原数组最后一个元素的下一位置设为null,用于在原数组全不为null是确定长度 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; }
// 通过下标访问数组 E elementData(int index){ return (E) elementData[index]; }
// 移除下标处元素 public E remove(int index){ // 检查是否越界 rangeCheck(index); // 结构修改次数+1 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; }
// 和indexOf相似,从前往后遍历查找value第一次出现的位置,进行删除 publicbooleanremove(Object o){ if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); returntrue; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); returntrue; } } returnfalse; }
// 和remove相似,先复制后续元素,然后清空最后一位引用 privatevoidfastRemove(int index){ modCount++; 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 }