Apa perbedaan persis antara kedua antarmuka ini? Apakah Enumeration
memiliki manfaat dibandingkan penggunaan Iterator
? Jika ada yang bisa menjelaskan, artikel referensi akan sangat dihargai.
Apa perbedaan persis antara kedua antarmuka ini? Apakah Enumeration
memiliki manfaat dibandingkan penggunaan Iterator
? Jika ada yang bisa menjelaskan, artikel referensi akan sangat dihargai.
Jawaban:
Melihat Spesifikasi Java API untuk Iterator
antarmuka, terdapat penjelasan tentang perbedaan antara Enumeration
:
Iterator berbeda dari pencacahan dalam dua cara:
- Iterator memungkinkan pemanggil untuk menghapus elemen dari koleksi yang mendasari selama iterasi dengan semantik yang ditentukan dengan baik.
- Nama metode telah diperbaiki.
Intinya adalah, keduanya Enumeration
dan Iterator
akan memberikan elemen yang berurutan, tetapi Iterator
ditingkatkan sedemikian rupa sehingga nama metode lebih pendek, dan memiliki remove
metode tambahan . Berikut ini perbandingan berdampingan:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Seperti yang juga disebutkan dalam Spesifikasi API Java, untuk program yang lebih baru, Iterator
sebaiknya lebih disukai daripada Enumeration
, karena "Iterator menggantikan Enumerasi dalam kerangka koleksi Java." (Dari Iterator
spesifikasinya.)
Iterator cepat gagal . yaitu ketika satu utas mengubah koleksi dengan operasi tambah / hapus, sementara utas lain melewatinya melalui Iterator menggunakan hasNext() or next()
metode, iterator gagal dengan cepat dengan melempar ConcurrentModificationException
. Perilaku cepat gagal dari iterator hanya dapat digunakan untuk mendeteksi bug. Pencacahan dikembalikan dengan metode kelas seperti Hashtable, Vektor tidak gagal-cepat yang dicapai dengan menyinkronkan blok kode di dalam nextElement()
metode yang mengunci objek Vektor saat ini yang menghabiskan banyak waktu.
"Secara resmi", mereka seharusnya serupa dengan antarmuka iterator yang mendukung operasi tambahan (misalnya, penghapusan). Umumnya, kecenderungannya adalah menggunakan iterator.
Berikut ini dari antarmuka pencacahan javadocs :
CATATAN: Fungsi antarmuka ini diduplikasi oleh antarmuka Iterator. Selain itu, Iterator menambahkan operasi penghapusan opsional, dan memiliki nama metode yang lebih pendek. Implementasi baru harus mempertimbangkan penggunaan Iterator daripada Pencacahan.
Satu fakta sederhana tetapi belum disebutkan dalam jawaban sebelumnya adalah yang Iterator<T>
digunakan dengan Iterable<T>
to melayani dalam menafsirkan for(_type_ element:collection){...}
struktur.
Ada tiga perbedaan mendasar dalam Pencacahan dan Iterator
Pencacahan
1. digunakan hanya untuk kelas lagacy (mis. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Operasi baca dapat dilakukan, kita tidak dapat menghapus elemen.
3. Dua Metode tersedia
Iterator
itu berlaku untuk semua Koleksi
Iterator itr = c.iterator();
where c is any `Collection` class
Operasi Baca dan Hapus dapat dilakukan
Tiga Metode tersedia
Batasan di keduanya
Add object
danReplace object
Jika Anda menulis class collection Anda sendiri, dan Anda memperluas class yang ada atau menerapkan salah satu antarmuka framework Collections, pada dasarnya Anda tidak punya pilihan selain menggunakan Iterator.
Jika karena alasan tertentu (yang saya tidak bisa pikirkan) Anda membuat kelas koleksi khusus yang tidak berhubungan dengan java.util.Collection atau java.util.Map dengan cara apa pun, Anda tetap harus mengimplementasikan Iterable sehingga orang dapat menggunakan kelas Anda untuk loop.
Perbedaan utamanya adalah Pencacahan tidak mengekspos metode remove (). Selain itu, Iterator tidak mengizinkan navigasi dan modifikasi secara bersamaan pada objek yang mendasarinya. Mereka memiliki kontrol untuk melihat apakah ada modifikasi bersamaan atau lebih, dan karenanya membutuhkan lebih banyak pemrosesan. Jadi, kinerja Pencacahan hampir 50% lebih cepat daripada Iterator. Jika kita hanya membutuhkan navigasi dengan mengabaikan sinkronisasi seperti itu, gunakan saja Pencacahan.
1) Perbedaan utama antara Iterator dan Enumerasi adalah penghapusan elemen saat melintasi koleksi. Iterator bisa menghapus elemen selama traversal pengumpulan karena memiliki metode remove (). Pencacahan tidak memiliki metode remove ().
2) Pencacahan bersifat gagal-aman. Itu tidak memunculkan ConcurrentModificationException jika Collection diubah selama traversal. Iterator bersifat cepat gagal. Itu melontarkan ConcurrentModificationException jika Collection diubah saat melakukan iterasi selain metode remove () miliknya sendiri.
3) Enumerasi adalah antarmuka lawas yang digunakan untuk melintasi Vektor, Hashtable. Iterator bukan antarmuka lama. Iterator dapat digunakan untuk traversal dari HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.
Baik iterator dan enumerasi digunakan untuk mengambil data, perbedaannya adalah enumerasi hanya dapat digunakan untuk kelas legacy yaitu vektor / stack sedangkan iterator dapat digunakan untuk sisanya. Pencacahan juga dapat digunakan untuk set kunci di peta.