这些函数都相对简单。因为存储的元素可能为null,所以判断的时候多了一次。
public int size() { return size;}public boolean isEmpty() { return size == 0;}public boolean contains(Object o) { return indexOf(o) >= 0;}public int indexOf(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;}public int lastIndexOf(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;}关于batchRemove()方法 1. 批量删除的方法,具体是对集合c和elementData的交集处理,这里详细说明一下。
假如集合c和elementData的交集是U,那么,如果complement是true,elementData最终会只存储U;如果complement是false,elementData最终删除U。2. 在对elementData的元素进行筛选的时候,这里使用了r、w两个游标,从而避免从新开辟一个新的数组进行存储。这种方法也是比较常见的一种算法题。
private boolean batchRemove(Collection<?> c, boolean complement) { final Object[] elementData = this.elementData; int r = 0, w = 0; boolean modified = false; try { // 在原有数组上进行筛选的方法,而不是另外开辟一个新的数组 for (; r < size; r++) if (c.contains(elementData[r]) == complement) elementData[w++] = elementData[r]; } finally { // Preserve behavioral compatibility with AbstractCollection, // even if c.contains() throws. if (r != size) { System.arraycopy(elementData, r, elementData, w, size - r); w += size - r; } if (w != size) { // 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;}新闻热点
疑难解答