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
- •
- •
- •
- •
- •
- •