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.36 by jsr166, Mon Oct 31 23:02:42 2016 UTC

# Line 1494 | Line 1494 | public class ArrayList<E> extends Abstra
1494          }
1495      }
1496  
1497 +    @SuppressWarnings("unchecked")
1498      @Override
1499      public boolean removeIf(Predicate<? super E> filter) {
1500          Objects.requireNonNull(filter);
1501 <        final int expectedModCount = modCount;
1502 <        final Object[] elementData = this.elementData;
1503 <        int r = 0, w = 0, remaining = size, deleted = 0;
1504 <        try {
1505 <            for (; remaining > 0; remaining--, r++) {
1506 <                @SuppressWarnings("unchecked") E e = (E) elementData[r];
1507 <                if (filter.test(e))
1508 <                    deleted++;
1509 <                else {
1510 <                    if (r != w)
1511 <                        elementData[w] = e;
1512 <                    w++;
1513 <                }
1514 <            }
1515 <            if (modCount != expectedModCount)
1516 <                throw new ConcurrentModificationException();
1517 <            return deleted > 0;
1518 <        } catch (Throwable ex) {
1519 <            if (deleted > 0)
1520 <                for (; remaining > 0; remaining--, r++, w++)
1521 <                    elementData[w] = elementData[r];
1522 <            throw ex;
1522 <        } finally {
1523 <            if (deleted > 0) {
1524 <                modCount++;
1525 <                size -= deleted;
1526 <                while (--deleted >= 0)
1527 <                    elementData[w++] = null;
1501 >        int expectedModCount = modCount;
1502 >        final Object[] es = elementData;
1503 >        final int size = this.size;
1504 >        final boolean modified;
1505 >        int r;
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 >                Arrays.fill(es, (this.size = w), size, null);
1518 >            } catch (Throwable ex) {
1519 >                // copy remaining elements
1520 >                System.arraycopy(es, r, es, w, size - r);
1521 >                Arrays.fill(es, (this.size = w + size - r), size, null);
1522 >                throw ex;
1523              }
1524          }
1525 +        if (modCount != expectedModCount)
1526 +            throw new ConcurrentModificationException();
1527 +        return modified;
1528      }
1529  
1530      @Override

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines