} //获取数组对象的位置,从前往后找 publicintindexOf(Object o){ if (o == null) {//如果对象为null那么查找为null的值 for (int i = 0; i < size; i++) if (elementData[i]==null) return i;//返回结果 } else {//for循环去找到位置 for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1;//返回-1没有找到 } //获取数组对象的位置,从后往前找 publicintlastIndexOf(Object o){ if (o == null) { for (int i = size-1; i >= 0; i--) if (elementData[i]==null) return i; } else {//for循环去找到位置 for (int i = size-1; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1;//返回-1没有找到 }
for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); returntrue; }
}//如果上面都没走到,返回false returnfalse;
}
//私有方法,跳过了边界检查,不会返回被移除的值 privatevoidfastRemove(int index){ modCount++;//修改次数+1 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
}
//清除数组里的所有信息 publicvoidclear(){
modCount++;//修改次数+1 // clear to let GC do its work,清空整个数组,让GC工作 for (int i = 0; i < size; i++)
elementData[i] = null;
//修改size大小 size = 0;
}
//移除集合中所有的对象 publicbooleanremoveAll(Collection<?> c){ Objects.requireNonNull(c);//判断是否为空,如果为空抛出异常 return batchRemove(c, false);//调用批量移除方法。 } //批量的删除collection里面的元素。 privatebooleanbatchRemove(Collection<?> c, boolean complement){ final Object[] elementData = this.elementData;//获取当前线性表的元素 int r = 0, w = 0; boolean modified = false; try { for (; r < size; r++)//循环列表中的所有数据进行比较,如果complement为true,将集合c中的元素,存放到数组的前面。W是从0开始 if (c.contains(elementData[r]) == complement) elementData[w++] = elementData[r]; } finally { // Preserve behavioral compatibility with AbstractCollection, // even if c.contains() throws. if (r != size) {//如果r不等于size,对数组进行copy,复制r后面的元素 System.arraycopy(elementData, r, elementData, w, size - r); w += size - r; } if (w != size) {//如果w不等于size,循环删除下标w后的元素 // clear to let GC do its work for (int i = w; i < size; i++) elementData[i] = null; modCount += size - w; size = w; modified = true; } } return modified; }
System中的copy方法
1 2 3 4
//会经常用到System的arraycopy的native方法,了解arraycopy方法。参数src是源数组,srcPos是源数组的位置。dest是目标数组,destPos是目标数组的位置,从源数组到目标数组length是要复制的数组的长度。 publicstaticnativevoidarraycopy(Object src, int srcPos, Object dest, int destPos, int length);