Last active
March 29, 2017 16:57
-
-
Save lawesson/101ed054fcdb00a94d69b34e04ef0be7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. | |
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. | |
* | |
*/ | |
package java.util; | |
... | |
public class ArrayList<E> extends AbstractList<E> | |
implements List<E>, RandomAccess, Cloneable, java.io.Serializable | |
{ | |
... | |
@Override | |
public boolean removeIf(Predicate<? super E> filter) { | |
Objects.requireNonNull(filter); | |
// figure out which elements are to be removed | |
// any exception thrown from the filter predicate at this stage | |
// will leave the collection unmodified | |
int removeCount = 0; | |
final BitSet removeSet = new BitSet(size); | |
final int expectedModCount = modCount; | |
final int size = this.size; | |
for (int i=0; modCount == expectedModCount && i < size; i++) { | |
@SuppressWarnings("unchecked") | |
final E element = (E) elementData[i]; | |
if (filter.test(element)) { | |
removeSet.set(i); | |
removeCount++; | |
} | |
} | |
if (modCount != expectedModCount) { | |
throw new ConcurrentModificationException(); | |
} | |
// shift surviving elements left over the spaces left by removed elements | |
final boolean anyToRemove = removeCount > 0; | |
if (anyToRemove) { | |
final int newSize = size - removeCount; | |
for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) { | |
i = removeSet.nextClearBit(i); | |
elementData[j] = elementData[i]; | |
} | |
for (int k=newSize; k < size; k++) { | |
elementData[k] = null; // Let gc do its work | |
} | |
this.size = newSize; | |
if (modCount != expectedModCount) { | |
throw new ConcurrentModificationException(); | |
} | |
modCount++; | |
} | |
return anyToRemove; | |
} | |
... | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment