Trong lập trình Java, việc duyệt qua các tập hợp (collections) là một nhiệm vụ quan trọng. Hai interface phổ biến cho việc này là Enumeration và Iterator. Mặc dù cả hai đều cho phép truy cập qua các phần tử trong một tập hợp, nhưng chúng có nhiều sự khác biệt đáng chú ý. Trong bài viết này, chúng ta sẽ đi sâu vào sự khác biệt giữa hai interface này, các phương thức của chúng, và khi nào nên sử dụng cái nào.
Enumeration là một interface được sử dụng để duyệt qua các phần tử trong các tập hợp như Vector và Hashtable. Đây là một interface khá cũ, có mặt từ những phiên bản đầu của Java. Mặc dù đã tồn tại lâu, nhưng Enumeration có những hạn chế về khả năng.
Iterator là một interface hiện đại hơn, được giới thiệu trong Java 2 (JDK 1.2). Interface này cung cấp một cách tiếp cận linh hoạt hơn cho việc duyệt qua các tập hợp, được sử dụng trong các collection như ArrayList, HashSet, và LinkedList. Iterator cho phép không chỉ duyệt qua các phần tử mà còn có thể xóa các phần tử trong quá trình duyệt.
Enumerationboolean hasMoreElements(): Phương thức này kiểm tra xem còn phần tử nào trong tập hợp hay không.E nextElement(): Phương thức này trả về phần tử tiếp theo trong tập hợp.Iteratorboolean hasNext(): Tương tự như hasMoreElements, phương thức này kiểm tra xem còn phần tử nào trong tập hợp hay không.E next(): Phương thức này trả về phần tử tiếp theo trong tập hợp.void remove(): Phương thức này cho phép xóa phần tử vừa lấy bằng phương thức next(), điều này không khả dụng trong Enumeration.Enumeration và Iterator| Tiêu chí | Enumeration | Iterator |
|---|---|---|
| Phương thức xóa | Không hỗ trợ phương thức remove(). | Hỗ trợ phương thức remove(). |
| Tính linh hoạt | Không hỗ trợ tính năng an toàn đồng thời. | Hỗ trợ tính năng an toàn đồng thời (có thể đồng bộ hóa). |
| Được sử dụng trong | Thường được sử dụng với Vector và Hashtable. | Được sử dụng với các collection hiện đại như ArrayList, HashSet, LinkedList, v.v. |
| Độ phổ biến | Ít phổ biến hơn trong lập trình hiện đại. | Thường được sử dụng hơn trong các ứng dụng Java hiện nay. |
| Kiểu trả về | Chỉ trả về các phần tử, không hỗ trợ kiểu trả về khác. | Có thể trả về kiểu khác thông qua generics. |
EnumerationDưới đây là một ví dụ minh họa cách sử dụng Enumeration với lớp Vector.
import java.util.Vector;
import java.util.Enumeration;
public class EnumerationExample {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.add("Banana");
vector.add("Cherry");
Enumeration<String> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
System.out.println(enumeration.nextElement());
}
}
}
IteratorDưới đây là ví dụ về cách sử dụng Iterator với lớp ArrayList.
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
// Nếu muốn xóa phần tử
iterator.remove(); // Xóa phần tử đã lấy
}
}
}
Khi làm việc với các tập hợp trong Java, bạn nên sử dụng Iterator cho hầu hết các tình huống vì những lý do sau:
Iterator cung cấp phương thức remove(), cho phép bạn xóa phần tử một cách an toàn trong quá trình duyệt.Iterator là một phần của Collections Framework hiện đại, dễ dàng tích hợp với các tính năng khác của Java.Mặc dù Enumeration có thể vẫn hữu ích trong một số trường hợp đặc biệt, nhưng bạn nên ưu tiên sử dụng Iterator cho việc duyệt qua các tập hợp trong Java.
Tóm lại, việc lựa chọn giữa Enumeration và Iterator phụ thuộc vào yêu cầu cụ thể của ứng dụng của bạn. Tuy nhiên, với sự phát triển của Java, Iterator đã trở thành lựa chọn phổ biến và linh hoạt hơn cho việc duyệt qua các phần tử trong tập hợp.