Iterator trong Java được sử dụng trong Colleciton framework để truy xuất từng phần tử một. Nó là một trình vòng lặp phổ quát vì chúng ta có thể áp dụng nó cho bất kỳ đối tượng Colleciton. Bằng cách sử dụng Iterator, chúng ta có thể thực hiện cả thao tác đọc và xóa. Đây là phiên bản cải tiến của Enumeration với chức năng bổ sung là loại bỏ một phần tử.
Iterator phải được sử dụng bất cứ khi nào chúng ta muốn liệt kê các phần tử trong tất cả các giao diện được triển khai của Khung sưu tập như Set, List, Queue, Deque và tất cả các lớp đã triển khai của giao diện Map. Trình vòng lặp là con trỏ duy nhất có sẵn cho toàn bộ khung bộ sưu tập. Một đối tượng iterator có thể được tạo bằng cách gọi phương thức iterator() có trong giao diện Collection.
Iterator itr = c.iterator();
Các phương thức của Interface Iterator trong Java
Interface iterator định nghĩa ba phương thức như được liệt kê dưới đây:
- hasNext(): Trả về true nếu phép lặp có nhiều phần tử hơn.
public boolean hasNext();
2. next(): Trả về phần tử tiếp theo trong lần lặp. Nó ném ra NoSuchElementException nếu không còn phần tử nào nữa.
public Object next();
3. remove(): Loại bỏ phần tử tiếp theo trong lần lặp. Phương thức này chỉ có thể được gọi một lần cho mỗi lệnh gọi tới next().
public void remove();
Java Iterator hoạt động nội bộ như thế nào?
Trong phần này, chúng ta sẽ cố gắng hiểu cách Java Iterator và các phương thức của nó hoạt động nội bộ. Chúng ta hãy lấy đối tượng LinkedList sau đây để hiểu chức năng này.
List<String> cities = new LinkedList<>(); cities.add("G-1"); cities.add("G-2"); cities.add("G-3"); . . . cities.add("G-n");
Bây giờ chúng ta tạo một đối tượng Iterator trên đối tượng List như dưới đây:
Iterator<String> citiesIterator = cities.iterator();
Trình vòng lặp “cityIteartor” sẽ trông như thế này –
Ở đây Con trỏ của Iterator đang trỏ trước phần tử đầu tiên của List.
Bây giờ chúng ta sẽ chạy đoạn mã sau.
citiesIterator.hasNext();
citiesIterator.next();
Khi chúng ta chạy đoạn mã trên, Con trỏ của Iterator sẽ trỏ đến phần tử đầu tiên trong danh sách như trong sơ đồ trên.
Bây giờ chúng ta sẽ chạy đoạn mã sau.
citiesIterator.hasNext();
citiesIterator.next();
Khi chúng ta chạy đoạn mã trên, Con trỏ của Iterator sẽ trỏ đến phần tử thứ hai trong danh sách như trong sơ đồ trên. Thực hiện quy trình này để đưa Con trỏ của Iterator đến phần tử cuối của Danh sách.
Sau khi đọc phần tử cuối cùng, nếu chúng ta chạy đoạn mã bên dưới, nó sẽ trả về giá trị “false”.
citiesIterator.hasNext();
Khi Con trỏ của Iterator trỏ đến phần tử sau phần tử cuối cùng của List, phương thức hasNext() trả về giá trị sai.
Note: Sau khi quan sát tất cả các sơ đồ này, chúng ta có thể nói rằng Java Iterator chỉ hỗ trợ Lặp lại hướng chuyển tiếp như trong sơ đồ bên dưới. Vì vậy nó còn được gọi là Con trỏ một chiều.
Ví dụ:
// Java program to Demonstrate Iterator // Importing ArrayList and Iterator classes // from java.util package import java.util.ArrayList; import java.util.Iterator; // Main class public class Test { // Main driver method public static void main(String[] args) { // Creating an ArrayList class object // Declaring object of integer type ArrayList<Integer> al = new ArrayList<Integer>(); // Iterating over the List for (int i = 0; i < 10; i++) al.add(i); // Printing the elements in the List System.out.println(al); // At the beginning itr(cursor) will point to // index just before the first element in al Iterator<Integer> itr = al.iterator(); // Checking the next element where // condition holds true till there is single element // in the List using hasnext() method while (itr.hasNext()) { // Moving cursor to next element int i = itr.next(); // Getting elements one by one System.out.print(i + " "); // Removing odd elements if (i % 2 != 0) itr.remove(); } // Command for next line System.out.println(); // Printing the elements inside the object System.out.println(al); } }