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.
Enumeration
boolean 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.Iterator
boolean 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. |
Enumeration
Dướ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()); } } }
Iterator
Dướ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.