Standard for loop traversal

java
import java.util.ArrayList;

ArrayList<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");

for (int i = 0; i < names.size(); i++) {
    System.out.println(i + ": " + names.get(i));
}
0: Alice
1: Bob
2: Charlie

Enhanced for loop traversal

java
for (String name : names) {
    System.out.println(name);
}

Comparing traversal methods

The removal trap (THE most important ArrayList concept)

The problem: Forward removal skips elements

java
ArrayList<Integer> nums = new ArrayList<>();
nums.add(1); nums.add(2); nums.add(2); nums.add(3);
// nums = [1, 2, 2, 3]

// WRONG: Forward traversal with removal
for (int i = 0; i < nums.size(); i++) {
    if (nums.get(i) == 2) {
        nums.remove(i);
    }
}
System.out.println(nums);  // [1, 2, 3] — missed one!

Solution 1: Traverse backward

java
for (int i = nums.size() - 1; i >= 0; i--) {
    if (nums.get(i) == 2) {
        nums.remove(i);
    }
}
System.out.println(nums);  // [1, 3] — correct!

Solution 2: Adjust the index after removal

java
for (int i = 0; i < nums.size(); i++) {
    if (nums.get(i) == 2) {
        nums.remove(i);
        i--;  // counteract the i++ to recheck this index
    }
}

Solution 3: While loop

java
int i = 0;
while (i < nums.size()) {
    if (nums.get(i) == 2) {
        nums.remove(i);  // don't increment — recheck same index
    } else {
        i++;  // only increment when NOT removing
    }
}

ConcurrentModificationException

java
// CRASHES at runtime!
for (String name : names) {
    if (name.equals("Bob")) {
        names.remove(name);  // ConcurrentModificationException!
    }
}

Modifying elements during traversal

java
ArrayList<String> words = new ArrayList<>();
words.add("hello"); words.add("world");

for (int i = 0; i < words.size(); i++) {
    words.set(i, words.get(i).toUpperCase());
}
System.out.println(words);  // [HELLO, WORLD]

Complete example: Filtering a list

java
import java.util.ArrayList;

public class ScoreFilter {
    public static void main(String[] args) {
        ArrayList<Integer> scores = new ArrayList<>();
        scores.add(95); scores.add(42); scores.add(88);
        scores.add(35); scores.add(91); scores.add(50);
        
        System.out.println("Before: " + scores);
        // [95, 42, 88, 35, 91, 50]
        
        // Remove all failing scores (below 60)
        for (int i = scores.size() - 1; i >= 0; i--) {
            if (scores.get(i) < 60) {
                scores.remove(i);
            }
        }
        
        System.out.println("After:  " + scores);
        // [95, 88, 91]
        
        // Calculate average of remaining
        int sum = 0;
        for (int s : scores) {
            sum += s;
        }
        double avg = (double) sum / scores.size();
        System.out.println("Average: " + avg);  // 91.33...
    }
}

AP Exam Tips

Common Mistakes

Key Vocabulary