Perbedaan antara Java Enumeration dan Iterator


Jawaban:


142

Melihat Spesifikasi Java API untuk Iteratorantarmuka, 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 Enumerationdan Iteratorakan memberikan elemen yang berurutan, tetapi Iteratorditingkatkan sedemikian rupa sehingga nama metode lebih pendek, dan memiliki removemetode 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, Iteratorsebaiknya lebih disukai daripada Enumeration, karena "Iterator menggantikan Enumerasi dalam kerangka koleksi Java." (Dari Iteratorspesifikasinya.)


9
Saya pikir ada sedikit penjelasan yang hilang dari jawaban ini terkait konkurensi.
Maarten Bodewes

@Paul_Draper: Pengeditan tidak boleh menambah arti baru pada posting, untuk itulah komentar.
Emil

2
@coobird Apakah Anda yakin "Penghitungan biasanya lebih cepat"? karena Pencacahan memiliki "blok sinkronisasi kode di dalam nextElement ()" Dan Kami tidak memiliki Sinkronisasi di Iterators yang menyebabkan rit ConcurrentModificationException ?? Apakah kita menyebut Iterator biasanya lebih cepat dan Pencacahan sedikit lebih aman. ??
Kanagavelu Sugumar

@KanagaveluSugumar Terima kasih telah menunjukkannya. (Saya tidak memperhatikan bahwa diskusi tambahan ditambahkan ke jawaban ini.) Saya telah membatalkan suntingan, karena itu tidak sepenuhnya akurat.
coobird

Saya pikir ada baiknya menunjukkan bahwa remove () adalah metode opsional pada antarmuka Iterator dan cukup banyak kelas yang mengimplementasikan tidak menerapkannya.
Kutzi

35

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.


5
Hanya sebagian yang benar: perilaku ini tidak ditentukan dalam antarmuka, terserah pada implementasi Iterator. Memang benar bahwa implementasi koleksi 'lama' di java.util (HashSet, ArrayList, dll.) Menunjukkan perilaku ini. Namun, koleksi 'konkuren' yang lebih baru tidak akan pernah menampilkan ConcurrentModificationException, mereka akan melintasi koleksi sejak iterator dibuat. Penerapan lain mungkin masih menunjukkan perilaku yang berbeda.
Kutzi

1
Juga perlu diperhatikan: "Perhatikan bahwa perilaku cepat-gagal tidak dapat dijamin karena, secara umum, tidak mungkin untuk membuat jaminan keras apa pun jika ada modifikasi serentak yang tidak tersinkronisasi. Operasi cepat-gagal mengeluarkan ConcurrentModificationException dengan upaya terbaik. Oleh karena itu, , akan salah jika menulis program yang bergantung pada pengecualian ini untuk kebenarannya: ConcurrentModificationException seharusnya hanya digunakan untuk mendeteksi bug. " docs.oracle.com/javase/7/docs/api/java/util/…
Kutzi

11

"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.


6

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.


5

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

  • public boolean hasNextElement ();
  • Objek publik nextElement ();

Iterator

  1. itu berlaku untuk semua Koleksi

    Iterator itr = c.iterator();  
    where c is any `Collection` class
  2. Operasi Baca dan Hapus dapat dilakukan

  3. Tiga Metode tersedia

    • public boolean hasNext ();
    • Objek publik berikutnya ();
    • public void remove ();

Batasan di keduanya

  • Bergerak hanya ke depan
  • Tidak ada metode untuk Add objectdanReplace object

2

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.


2

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.


Memang benar bahwa Enumerasi tidak "tidak" mengekspos metode remove () - tetapi juga tidak memperhatikan pemanggilan api remove () Collection. Misalnya kode berikut hanya akan mencetak: AAA, CCC, EEE. -------------------------------------------------- --- Vektor <String> v = Vektor baru <String> (6); v.add ("AAA"); v.add ("BBB"); v.add ("CCC"); v.add ("DDD"); v.add ("EEE"); v.add ("FFF"); Pencacahan <String> en = v.elements (); sementara (en.hasMoreElements ()) Nilai string = (String) en.nextElement (); System.out.println (nilai); v.hapus (nilai);
javauser71

1

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.


0

Enumerasi hanya dapat digunakan untuk kelas lama (Vektor, Stack ...), sedangkan Iterator dapat digunakan untuk semua.


-1

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.


Di mana Anda melihat bahwa Anda dapat menggunakan Pencacahan untuk set kunci Peta ??
Kutzi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.