Có 3 cách chính để duyệt/retrieve phần tử từ Collection:
1. Vòng lặp for-each (Enhanced for loop) - Phổ biến nhất
Cú pháp gọn, đọc dễ, áp dụng cho mọi loại Collection.
ArrayList<String> list = new ArrayList<>();
list.add("JavaFX"); list.add("Java"); list.add("WebGL");
for (String e : list) {
System.out.println(e);
}
2. Iterator / ListIterator - Linh hoạt, cho phép xóa khi duyệt
Iterator: Chỉ duyệt tiến (forward).ListIterator: Duyệt 2 chiều (forward/backward), cho phép add/set/remove.
import java.util.*;
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// ListIterator - duyệt ngược
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) lit.next(); // Đi đến cuối
while (lit.hasPrevious()) {
System.out.println(lit.previous()); // In ngược
}
3. Enumeration - Cũ (Legacy), chỉ cho Vector/Hashtable
import java.util.*;
Vector<Integer> vec = new Vector<>();
vec.add(1254); vec.add(4587); vec.add(5211);
Enumeration<Integer> en = vec.elements();
while (en.hasMoreElements()) {
System.out.println(en.nextElement());
}
So sánh nhanh
| Cách | Ưu điểm | Nhược điểm | Dùng khi |
|---|---|---|---|
| for-each | Ngắn gọn, an toàn, dễ đọc | Không xóa được khi duyệt | Chỉ đọc, in ra |
| Iterator | Xóa được khi duyệt (it.remove()) | Verbose hơn | Cần xóa element |
| ListIterator | Duyệt 2 chiều, add/set/remove | Chỉ cho List | Cần thao tác phức tạp trên List |
| Enumeration | Legacy API | Chỉ Vector/Hashtable, ít tính năng | Code cũ, maintain |
Java 8+: Cũng có thể dùng stream() / forEach():
list.forEach(System.out::println);
list.stream().filter(s -> s.startsWith("J")).forEach(System.out::println);