ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/ArrayList.java
(Generate patch)

Comparing jsr166/src/main/java/util/ArrayList.java (file contents):
Revision 1.35 by jsr166, Tue Oct 18 22:15:15 2016 UTC vs.
Revision 1.37 by jsr166, Fri Nov 4 03:09:27 2016 UTC

# Line 716 | Line 716 | public class ArrayList<E> extends Abstra
716       * @see Collection#contains(Object)
717       */
718      public boolean removeAll(Collection<?> c) {
719        Objects.requireNonNull(c);
719          return batchRemove(c, false);
720      }
721  
# Line 737 | Line 736 | public class ArrayList<E> extends Abstra
736       * @see Collection#contains(Object)
737       */
738      public boolean retainAll(Collection<?> c) {
740        Objects.requireNonNull(c);
739          return batchRemove(c, true);
740      }
741  
742      private boolean batchRemove(Collection<?> c, boolean complement) {
743 <        final Object[] elementData = this.elementData;
744 <        int r = 0, w = 0;
745 <        boolean modified = false;
746 <        try {
747 <            for (; r < size; r++)
748 <                if (c.contains(elementData[r]) == complement)
749 <                    elementData[w++] = elementData[r];
750 <        } finally {
751 <            // Preserve behavioral compatibility with AbstractCollection,
752 <            // even if c.contains() throws.
753 <            if (r != size) {
754 <                System.arraycopy(elementData, r,
755 <                                 elementData, w,
756 <                                 size - r);
743 >        Objects.requireNonNull(c);
744 >        final Object[] es = elementData;
745 >        final int size = this.size;
746 >        final boolean modified;
747 >        int r;
748 >        // Optimize for initial run of survivors
749 >        for (r = 0; r < size; r++)
750 >            if (c.contains(es[r]) != complement)
751 >                break;
752 >        if (modified = (r < size)) {
753 >            int w = r++;
754 >            try {
755 >                for (Object e; r < size; r++)
756 >                    if (c.contains(e = es[r]) == complement)
757 >                        es[w++] = e;
758 >            } catch (Throwable ex) {
759 >                // Preserve behavioral compatibility with AbstractCollection,
760 >                // even if c.contains() throws.
761 >                System.arraycopy(es, r, es, w, size - r);
762                  w += size - r;
763 <            }
764 <            if (w != size) {
762 <                // clear to let GC do its work
763 <                for (int i = w; i < size; i++)
764 <                    elementData[i] = null;
763 >                throw ex;
764 >            } finally {
765                  modCount += size - w;
766 <                size = w;
767 <                modified = true;
766 >                Arrays.fill(es, (this.size = w), size, null);
767              }
768          }
769          return modified;
# Line 1494 | Line 1493 | public class ArrayList<E> extends Abstra
1493          }
1494      }
1495  
1496 +    @SuppressWarnings("unchecked")
1497      @Override
1498      public boolean removeIf(Predicate<? super E> filter) {
1499          Objects.requireNonNull(filter);
1500 <        final int expectedModCount = modCount;
1501 <        final Object[] elementData = this.elementData;
1502 <        int r = 0, w = 0, remaining = size, deleted = 0;
1503 <        try {
1504 <            for (; remaining > 0; remaining--, r++) {
1505 <                @SuppressWarnings("unchecked") E e = (E) elementData[r];
1506 <                if (filter.test(e))
1507 <                    deleted++;
1508 <                else {
1509 <                    if (r != w)
1510 <                        elementData[w] = e;
1511 <                    w++;
1512 <                }
1513 <            }
1514 <            if (modCount != expectedModCount)
1515 <                throw new ConcurrentModificationException();
1516 <            return deleted > 0;
1517 <        } catch (Throwable ex) {
1518 <            if (deleted > 0)
1519 <                for (; remaining > 0; remaining--, r++, w++)
1520 <                    elementData[w] = elementData[r];
1521 <            throw ex;
1522 <        } finally {
1523 <            if (deleted > 0) {
1524 <                modCount++;
1525 <                size -= deleted;
1526 <                while (--deleted >= 0)
1527 <                    elementData[w++] = null;
1500 >        int expectedModCount = modCount;
1501 >        final Object[] es = elementData;
1502 >        final int size = this.size;
1503 >        final boolean modified;
1504 >        int r;
1505 >        // Optimize for initial run of survivors
1506 >        for (r = 0; r < size; r++)
1507 >            if (filter.test((E) es[r]))
1508 >                break;
1509 >        if (modified = (r < size)) {
1510 >            expectedModCount++;
1511 >            modCount++;
1512 >            int w = r++;
1513 >            try {
1514 >                for (E e; r < size; r++)
1515 >                    if (!filter.test(e = (E) es[r]))
1516 >                        es[w++] = e;
1517 >            } catch (Throwable ex) {
1518 >                // copy remaining elements
1519 >                System.arraycopy(es, r, es, w, size - r);
1520 >                w += size - r;
1521 >                throw ex;
1522 >            } finally {
1523 >                Arrays.fill(es, (this.size = w), size, null);
1524              }
1525          }
1526 +        if (modCount != expectedModCount)
1527 +            throw new ConcurrentModificationException();
1528 +        return modified;
1529      }
1530  
1531      @Override

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines