Re: Modify collection inside iteration
 
obaqueiro@gmail.com wrote:
ArrayList<MyObject> objects = new ArrayList<MyObject>().
[...]
 for (MyObject obj: this.objects) {
         if (obj.getFlag()==true){
                  objects.remove(obj);
         }
}
That may or may not throw ConcurrentModificationException (best efforts
doesn't mean the implementation tries that hard).
Some of your options, in descending order of merit, are:
private final List<MyObject> objects = new ArrayList<MyObject>();
....
    for (
        Iterator<MyObject> iter=this.objects.iterator();
        iter.hasNext();
    ) {
        if (obj.getFlag()) {
            iter.remove();
        }
    }
// Nice and exception-safe, but can't use final.
private List<MyObject> objects = new ArrayList<MyObject>();
....
    final List<MyObject> objectsLocal = new ArrayList<MyObject>();
    for (MyObject obj: this.objects) {
        if (!obj.getFlag()) {
            objectsLocal.add(obj);
        }
    }
    this.objects = objectsLocal;
// Full copy, but not even exception-safe.
private final List<MyObject> objects = new ArrayList<MyObject>();
....
    for (MyObject obj: new ArrayList(this.objects)) { // or toArray
        if (obj.getFlag()) {
            this.objects.remove(obj);
        }
    }
// Expensive writes, and even reads are more expensive.
private final List<MyObject> objects =
    new CopyOnWriteArrayList<MyObject>();
....
    for (MyObject obj: this.objects) {
        if (obj.getFlag()) {
            this.objects.remove(obj);
        }
    }
private final List<MyObject> objects = new ArrayList<MyObject>();
....
    final int num = this.objects.size();
    BitSet indexes = new BitSet(num);
    int index = 0;
    for (MyObject obj: this.objects) {
        if (obj.getFlag()) {
            indexes.set(index);
        }
        ++index;
    }
    for (int ct=num; --ct>= 0; ) {
        if (indexes.get()) {
            this.objects.remove(index);
        }
    }
private final List<MyObject> objects = new ArrayList<MyObject>();
....
    final List<Integer> indexes = new ArrayList<Integer>();
    int i = 0;
    for (MyObject obj: this.objects) {
        if (obj.getFlag()) {
            indexes.add(i);
        }
        ++i;
    }
    Collections.reverse(indexes);
    for (int index : indexes) {
        this.objects.remove(index);
    }
[ObDisclaimer: Not even compiled, let alone tested.]
Tom Hawtin