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 |