มีหลักๆ 3 วิธี ในการเข้าถึง Element ทั้งหมดใน Collection
1. Enhanced For Loop (For-Each) - ง่ายที่สุด
List<String> list = Arrays.asList("Java", "Python", "Go");
for (String s : list) {
System.out.println(s);
}
2. Iterator / ListIterator - ควบคุมได้ละเอียด
Iterator- เดินหน้าได้อย่างเดียว (hasNext(),next(),remove())ListIterator- เดิน 2 ทิศทาง (hasPrevious(),previous(),add(),set())
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
// Iterator (Forward only)
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
// ListIterator (Bidirectional)
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) lit.next(); // เดินไปจนสุด
while (lit.hasPrevious()) {
System.out.println(lit.previous()); // ย้อนกลับ
}
3. Enumeration - Legacy (Vector, Hashtable)
Interface เก่า ใช้กับ Vector, Hashtable เท่านั้น
Vector<Integer> vec = new Vector<>(Arrays.asList(1,2,3));
Enumeration<Integer> en = vec.elements();
while (en.hasMoreElements()) {
System.out.println(en.nextElement());
}
วิธีเพิ่มเติม (Modern Java)
4. forEach() Method (Java 8+)
list.forEach(System.out::println); // หรือ list.forEach(s -> System.out.println(s));
5. Stream API (Java 8+)
list.stream().forEach(System.out::println); // รองรับ Parallel: list.parallelStream().forEach(...)
ตารางเปรียบเทียบ
| วิธี | ทิศทาง | แก้ไขระหว่าง Iterate | รองรับ |
|---|---|---|---|
| For-Each | Forward | ไม่ได้ (ConcurrentModificationException) | ทุก Collection |
| Iterator | Forward | ได้ (ผ่าน it.remove()) |
ทุก Collection |
| ListIterator | Forward/Backward | ได้ (add, set, remove) | List เท่านั้น |
| Enumeration | Forward | ไม่ได้ | Vector, Hashtable (Legacy) |
| forEach() / Stream | Forward | ไม่ได้ (Structural Modification) | ทุก Collection |
แนวทางเลือก
- อ่านอย่างเดียว -> For-Each หรือ forEach()
- ต้อง Remove ระหว่าง Loop -> Iterator.remove()
- ต้องเดินย้อนหลังหรือ Add/Set -> ListIterator
- ต้อง Filter/Map/Reduce -> Stream API