Bu iki arayüz arasındaki tam fark nedir? Enumeration
Kullanmaya göre faydaları var mı Iterator
? Herhangi biri detaylandırabilirse, bir referans makalesi takdir edilecektir.
Bu iki arayüz arasındaki tam fark nedir? Enumeration
Kullanmaya göre faydaları var mı Iterator
? Herhangi biri detaylandırabilirse, bir referans makalesi takdir edilecektir.
Yanıtlar:
Iterator
Arayüz için Java API Spesifikasyonuna bakıldığında, aşağıdakiler arasındaki farkların bir açıklaması vardır Enumeration
:
Yineleyiciler, numaralandırmalardan iki şekilde farklılık gösterir:
- Yineleyiciler, çağıranın iyi tanımlanmış anlamlarla yineleme sırasında temeldeki koleksiyondan öğeleri kaldırmasına olanak tanır.
- Yöntem isimleri iyileştirildi.
Alt çizgi, iki Enumeration
ve Iterator
birbirini takip eden elemanlar verecektir, ama Iterator
yöntem adları kısadır, böylece bu şekilde geliştirilir ve ek sahip remove
yöntem. İşte yan yana bir karşılaştırma:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Java API Spesifikasyonlarında da belirtildiği gibi, daha yeni programlar için, "Java koleksiyonları çerçevesinde Numaralandırmanın yerini yineleyici aldığından" Iterator
tercih edilmelidir Enumeration
. ( Iterator
Spesifikasyonlardan.)
Yineleyiciler başarısız olur . yani, bir iş parçacığı toplama / kaldırma işlemleriyle koleksiyonu değiştirdiğinde, başka bir iş parçacığı hasNext() or next()
yöntemi kullanarak bir Yineleyici üzerinden geçerken , yineleyici atarak hızla başarısız olur ConcurrentModificationException
. Yineleyicilerin hata hızlı davranışı yalnızca hataları tespit etmek için kullanılabilir. Hashtable, Vector gibi sınıfların yöntemleriyle döndürülen Numaralandırmalar, nextElement()
çok fazla zamana mal olan geçerli Vector nesnesini kilitleyen yöntem içindeki kod bloğunun senkronize edilmesiyle elde edilen başarısızlık hızlı değildir .
"Resmi olarak", fazladan işlemleri (örn. Kaldırma) destekleyen yineleyici arabirimiyle benzer olmaları gerekir. Genel olarak eğilim, yineleyiciler kullanmaktır.
İşte numaralandırma arayüzünden javadocs :
NOT: Bu arabirimin işlevselliği Yineleyici arabirimi tarafından çoğaltılır. Ek olarak, Iterator isteğe bağlı bir kaldırma işlemi ekler ve daha kısa yöntem adlarına sahiptir. Yeni uygulamalar, Numaralandırma yerine Yineleyici kullanmayı düşünmelidir.
Basit bir gerçek, ancak daha önceki cevaplarda belirtilmeyen, yapıyı yorumlamak için Iterator<T>
birlikte kullanılmasıdır .Iterable<T>
for(_type_ element:collection){...}
Numaralandırma ve Yineleyicide temel üç fark vardır
Numaralandırma
1. Sadece lagacy sınıfı için kullanılır (örn. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Okuma işlemi gerçekleştirilebilir, elemanı kaldıramayız.
3. İki Yöntem mevcuttur
yineleyici
tüm Koleksiyon için geçerlidir
Iterator itr = c.iterator();
where c is any `Collection` class
Okuma ve Kaldırma işlemi gerçekleştirilebilir
Üç Yöntem mevcuttur
Her ikisinde de sınırlama
Add object
veReplace object
Kendi koleksiyon sınıfınızı yazıyorsanız ve mevcut sınıflardan herhangi birini genişletiyorsanız veya Koleksiyonlar çerçeve arayüzlerinden herhangi birini uyguluyorsanız, temelde Yineleyiciyi kullanmaktan başka seçeneğiniz yoktur.
Herhangi bir nedenle (aklıma gelmiyor) java.util.Collection veya java.util.Map ile herhangi bir şekilde ilişkili olmayan özel bir koleksiyon sınıfı oluşturuyorsanız, yine de insanların kullanabilmesi için Yinelemeyi uygulamalısınız sınıfınız için döngüler.
Başlıca farklı olan, Numaralandırmanın remove () yöntemini göstermemesidir. Dahası, Yineleyici, alttaki bir nesnede aynı anda gezinmeye ve değiştirmeye izin vermez. Eşzamanlı değişiklikler olup olmadığını görmek için bir kontrole sahipler ve bu nedenle daha fazla işlem gerektirir. Dolayısıyla Numaralandırmanın performansı, Yineleyiciden neredeyse% 50 daha hızlıdır. Böyle bir senkronizasyonu göz ardı ederek sadece navigasyona ihtiyacımız varsa, sadece Numaralandırmayı kullanın.
1) Yineleyici ve Numaralandırma arasındaki temel fark, koleksiyon boyunca gezinirken öğenin kaldırılmasıdır. Yineleyici, remove () yöntemine sahip olduğu için koleksiyonun geçişi sırasında öğeyi kaldırabilir. Numaralandırma, remove () yöntemine sahip değildir.
2) Numaralandırma, doğası gereği güvenli değildir. Koleksiyon geçiş sırasında değiştirilirse ConcurrentModificationException oluşturmaz. Yineleyici, doğası gereği hızlı başarısız olur. Kendi remove () yöntemi dışında yineleme yaparken bir Koleksiyon değiştirilirse ConcurrentModificationException oluşturur.
3) Numaralandırma, Vector, Hashtable'ı geçmek için kullanılan eski bir arayüzdür. Yineleyici, eski bir arayüz değildir. Yineleyici, HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet geçişleri için kullanılabilir.
Verileri almak için hem yineleyici hem de numaralandırma kullanılır, aradaki fark, numaralandırmanın yalnızca eski sınıflar, yani vektör / yığın için kullanılabilirken, yineleyiciler geri kalanı için kullanılabilir olmasıdır. Haritalardaki anahtar seti için numaralandırma da kullanılabilir.