--- jsr166/src/main/java/util/ArrayList.java 2016/12/02 06:41:08 1.46 +++ jsr166/src/main/java/util/ArrayList.java 2016/12/21 05:15:36 1.49 @@ -578,8 +578,9 @@ public class ArrayList extends Abstra */ public void clear() { modCount++; - Arrays.fill(elementData, 0, size, null); - size = 0; + final Object[] es = elementData; + for (int to = size, i = size = 0; i < to; i++) + es[i] = null; } /** @@ -669,13 +670,17 @@ public class ArrayList extends Abstra outOfBoundsMsg(fromIndex, toIndex)); } modCount++; - final Object[] es = elementData; - final int oldSize = size; - System.arraycopy(es, toIndex, es, fromIndex, oldSize - toIndex); - Arrays.fill(es, size -= (toIndex - fromIndex), oldSize, null); + shiftTailOverGap(elementData, fromIndex, toIndex); // checkInvariants(); } + /** Erases the gap from lo to hi, by sliding down following elements. */ + private void shiftTailOverGap(Object[] es, int lo, int hi) { + System.arraycopy(es, hi, es, lo, size - hi); + for (int to = size, i = (size -= hi - lo); i < to; i++) + es[i] = null; + } + /** * A version of rangeCheck used by add and addAll. */ @@ -761,10 +766,8 @@ public class ArrayList extends Abstra w += end - r; throw ex; } finally { - final int oldSize = size, deleted = end - w; - modCount += deleted; - System.arraycopy(es, end, es, w, oldSize - end); - Arrays.fill(es, size -= deleted, oldSize, null); + modCount += end - w; + shiftTailOverGap(es, w, end); } } // checkInvariants(); @@ -1368,6 +1371,9 @@ public class ArrayList extends Abstra } } + /** + * @throws NullPointerException {@inheritDoc} + */ @Override public void forEach(Consumer action) { Objects.requireNonNull(action); @@ -1437,7 +1443,7 @@ public class ArrayList extends Abstra private int fence; // -1 until used; then one past last index private int expectedModCount; // initialized when fence set - /** Create new spliterator covering the given range */ + /** Creates new spliterator covering the given range. */ ArrayListSpliterator(int origin, int fence, int expectedModCount) { this.index = origin; this.fence = fence; @@ -1519,6 +1525,9 @@ public class ArrayList extends Abstra return (bits[i >> 6] & (1L << i)) == 0; } + /** + * @throws NullPointerException {@inheritDoc} + */ @Override public boolean removeIf(Predicate filter) { return removeIf(filter, 0, size); @@ -1553,9 +1562,7 @@ public class ArrayList extends Abstra for (i = beg; i < end; i++) if (isClear(deathRow, i - beg)) es[w++] = es[i]; - final int oldSize = size; - System.arraycopy(es, end, es, w, oldSize - end); - Arrays.fill(es, size -= (end - w), oldSize, null); + shiftTailOverGap(es, w, end); // checkInvariants(); return true; } else {