Iterator trong Java là một giao diện (interface) trong thư viện Collections, cung cấp một cách tiêu chuẩn để duyệt qua các phần tử trong một tập hợp (collection) mà không cần biết chi tiết về cách mà tập hợp đó được cài đặt.

1. Định nghĩa và vai trò của Iterator

Định nghĩa:

  • Iterator là một interface trong gói java.util, cho phép truy cập tuần tự các phần tử trong một collection như ArrayList, HashSet, LinkedList, và nhiều collection khác mà không cần biết đến cấu trúc bên trong của chúng.

Vai trò:

  • Duyệt qua các phần tử: Iterator cho phép bạn duyệt qua các phần tử của một collection một cách tuần tự.
  • Thao tác với phần tử: Nó cung cấp các phương thức để kiểm tra sự tồn tại của phần tử, lấy phần tử và loại bỏ phần tử hiện tại trong quá trình duyệt.

2. Các phương thức chính của Iterator

Iterator có ba phương thức chính:

1. hasNext()

  • Mô tả: Kiểm tra xem còn phần tử nào trong collection hay không.
  • Trả về: true nếu còn phần tử, false nếu không còn.

2. next()

  • Mô tả: Lấy phần tử tiếp theo trong collection.
  • Trả về: Phần tử tiếp theo của collection.
  • Ngoại lệ: Ném NoSuchElementException nếu không còn phần tử nào để lấy.

3. remove()

  • Mô tả: Xóa phần tử hiện tại (phần tử vừa được lấy bằng next()) khỏi collection.
  • Ngoại lệ: Ném IllegalStateException nếu phương thức này được gọi trước khi gọi next() hoặc sau khi gọi next() mà không gọi remove().

3. Ví dụ sử dụng Iterator

Dưới đây là một ví dụ minh họa cách sử dụng Iterator trong Java:

import java.util.ArrayList;
import java.util.Iterator;

public class IteratorExample {
    public static void main(String[] args) {
        // Tạo một ArrayList
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Orange");

        // Tạo một Iterator
        Iterator<String> iterator = fruits.iterator();

        // Duyệt qua các phần tử bằng Iterator
        while (iterator.hasNext()) {
            String fruit = iterator.next();
            System.out.println(fruit);
            
            // Xóa phần tử "Banana"
            if (fruit.equals("Banana")) {
                iterator.remove();
            }
        }

        // Kiểm tra danh sách sau khi xóa
        System.out.println("After removal: " + fruits);
    }
}

Kết quả:

Apple
Banana
Orange
After removal: [Apple, Orange]

4. Lợi ích của Iterator

  • Khả năng tương thích: Iterator cung cấp một cách thống nhất để duyệt qua các collection khác nhau mà không cần biết loại của chúng.
  • Dễ dàng thao tác: Bạn có thể dễ dàng loại bỏ phần tử trong quá trình duyệt mà không gặp phải lỗi ConcurrentModificationException, thường gặp khi sử dụng vòng lặp for-each.
  • Không phụ thuộc vào cấu trúc: Bạn không cần phải biết chi tiết về cách cài đặt của collection, giúp mã của bạn trở nên linh hoạt hơn.

5. Kết luận

Iterator là một công cụ mạnh mẽ trong Java Collections Framework, cho phép bạn duyệt qua các phần tử một cách hiệu quả và an toàn. Việc hiểu rõ cách hoạt động của Iterator sẽ giúp bạn làm việc với các tập hợp trong Java một cách dễ dàng và hiệu quả hơn.