Java Enumeration과 Iterator의 차이점


답변:


142

Iterator인터페이스 에 대한 Java API 사양을 보면 다음 과 같은 차이점에 대한 설명이 있습니다 Enumeration.

반복자는 두 가지면에서 열거 형과 다릅니다.

  • 반복자를 사용하면 호출자가 잘 정의 된 의미 체계를 사용하여 반복하는 동안 기본 컬렉션에서 요소를 제거 할 수 있습니다.
  • 메서드 이름이 개선되었습니다.

결론은, 모두 EnumerationIterator연속적인 요소를 제공하지만, Iterator메소드 이름은 짧은 그래서 같은 방식으로 개선하고, 추가로이 remove방법을. 다음은 나란히 비교 한 것입니다.

  Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

Java API 사양에서도 언급했듯이 최신 프로그램의 경우 "반복자가 Java 컬렉션 프레임 워크에서 열거를 대신합니다." Iterator보다 선호되어야합니다 Enumeration. ( Iterator사양에서.)


9
동시성에 관한이 답변에서 누락 된 설명이 약간 있다고 생각합니다.
Maarten Bodewes 2012

@Paul_Draper : 편집은 게시물에 새로운 의미를 추가해서는 안됩니다.
Emil

2
@coobird "열거가 일반적으로 더 빠릅니다"가 확실합니까? Enumeration에는 "nextElement () 내부에서 코드 블록 동기화"가 있고 ConcurrentModificationException rit을 유발하는 반복기에서 동기화가 없기 때문에 ?? Iterators는 일반적으로 더 빠르고 Enumerations는 조금 더 안전합니다. ??
Kanagavelu Sugumar 2013 년

@KanagaveluSugumar 지적 해주셔서 감사합니다. (이 답변에 추가 토론이 추가 된 것을 알지 못했습니다.) 완전히 정확하지 않았기 때문에 편집을 롤백했습니다.
coobird 2013 년

remove ()는 Iterator 인터페이스의 선택적 메서드이며 많은 구현 클래스가이를 구현하지 않는다는 점을 지적 할 가치가 있다고 생각합니다.
Kutzi

35

이터레이터는 실패시 빠릅니다 . 즉, 한 스레드가 추가 / 제거 작업을 통해 컬렉션을 변경하고 다른 스레드가 hasNext() or next()메서드 를 사용하여 Iterator를 통해 컬렉션을 순회하는 동안 반복자는 throw하여 빠르게 실패합니다 ConcurrentModificationException. 반복자의 fail-fast 동작은 버그를 감지하는 데만 사용할 수 있습니다. Hashtable, Vector와 같은 클래스의 메서드에 의해 반환 된 열거 형은 nextElement()많은 시간이 소요되는 현재 Vector 객체를 잠그는 메서드 내에서 코드 블록을 동기화하여 달성되는 오류가 없습니다 .


5
부분적으로 만 사실입니다.이 동작은 인터페이스에 정의되어 있지 않으며 Iterator 구현에 달려 있습니다. java.util (HashSet, ArrayList 등)의 '이전'컬렉션 구현이 이러한 동작을 나타내는 것은 사실입니다. 그러나 새로운 '동시'컬렉션은 ConcurrentModificationException을 throw하지 않으며 반복기 생성 시점에 컬렉션을 순회합니다. 다른 구현은 여전히 ​​다른 동작을 보일 수 있습니다.
Kutzi

1
또한 다음 사항을 지적 할 가치가 있습니다. "일반적으로 말해서 동기화되지 않은 동시 수정이있는 경우에는 어떠한 엄격한 보장도 불가능하므로 Fail-Fast 동작은 보장 할 수 없습니다. Fail-Fast 작업은 최선의 노력으로 ConcurrentModificationException을 발생시킵니다. 따라서 , 정확성을 위해이 예외에 의존하는 프로그램을 작성하는 것은 잘못된 것입니다. ConcurrentModificationException은 버그를 감지하는 데만 사용해야합니다. " docs.oracle.com/javase/7/docs/api/java/util/...
Kutzi

11

"공식적으로", 추가 작업 (예 : 제거)을 지원하는 반복기 인터페이스와 유사해야합니다. 일반적으로 반복자를 사용하는 경향이 있습니다.

다음은 열거 형 인터페이스 javadocs입니다 .

참고 :이 인터페이스의 기능은 Iterator 인터페이스에 의해 복제됩니다. 또한 Iterator는 선택적 제거 작업을 추가하고 메서드 이름이 더 짧습니다. 새로운 구현에서는 Enumeration보다 Iterator 사용을 고려해야합니다.


6

하나의 간단한 사실이지만 이전 답변에서 언급하지 않은 것은 구조 해석에 Iterator<T>사용되는 데 사용 된다는 것 입니다 .Iterable<T>for(_type_ element:collection){...}


5

Enumeration과 Iterator에는 기본적인 세 가지 차이점이 있습니다.

열거
1 만 lagacy 클래스의 사용 (예. Vector)

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. 읽기 작업을 수행 할 수 있지만 요소를 제거 할 수 없습니다.
3. 두 가지 방법을 사용할 수 있습니다

  • 공개 부울 hasNextElement ();
  • 공용 개체 nextElement ();

반복자

  1. 모든 컬렉션에 적용 가능

    Iterator itr = c.iterator();  
    where c is any `Collection` class
  2. 읽기 및 제거 작업을 수행 할 수 있습니다.

  3. 세 가지 방법을 사용할 수 있습니다.

    • 공개 부울 hasNext ();
    • 공용 개체 next ();
    • public void remove ();

둘 다의 한계

  • 앞으로 만 이동
  • 이 없음에 대한 방법 Add object및 없다Replace object

2

자체 컬렉션 클래스를 작성하고 기존 클래스를 확장하거나 컬렉션 프레임 워크 인터페이스를 구현하는 경우 기본적으로 Iterator를 사용할 수밖에 없습니다.

어떤 이유로 (내가 생각할 수없는) 어떤 방법으로 java.util.Collection으로 또는 java.util.Map 관련되지 않는 사용자 지정 컬렉션 클래스를 만드는, 당신이해야에 대한 경우에는 여전히 사람들이 사용할 수 있도록의 Iterable을 구현 for 루프의 클래스.


2

주요 차이점은 Enumeration이 remove () 메서드를 노출하지 않는다는 것입니다. 또한 Iterator는 기본 개체에 대한 탐색 및 수정을 동시에 허용하지 않습니다. 동시 수정 여부를 확인하는 제어 권한이 있으므로 더 많은 처리가 필요합니다. 따라서 Enumeration의 성능은 Iterator보다 거의 50 % 더 빠릅니다. 이러한 동기화를 무시하고 탐색 만 필요하면 열거 형을 사용하십시오.


Enumeration이 remove () 메서드를 노출하지 "않는"것은 사실이지만 Collection의 remove () api 호출에도주의를 기울이지 않습니다. 예를 들어 다음 코드는 AAA, CCC, EEE 만 인쇄합니다. -------------------------------------------------- --- 벡터 <문자열> v = 새 벡터 <문자열> (6); v.add ( "AAA"); v.add ( "BBB"); v.add ( "CCC"); v.add ( "DDD"); v.add ( "EEE"); v.add ( "FFF"); 열거 형 <문자열> en = v.elements (); while (en.hasMoreElements ()) 문자열 값 = (문자열) en.nextElement (); System.out.println (값); v.remove (값);
javauser71

1

1) Iterator와 Enumeration의 주요 차이점은 컬렉션을 탐색하는 동안 요소를 제거하는 것입니다. Iterator는 remove () 메서드가 있으므로 컬렉션을 순회하는 동안 요소를 제거 할 수 있습니다. 열거 형에는 remove () 메서드가 없습니다.

2) 열거는 본질적으로 안전합니다. 순회 중에 Collection이 수정되면 ConcurrentModificationException을 발생시키지 않습니다. Iterator는 본질적으로 오류가 발생하지 않습니다. 컬렉션이 자신의 remove () 메서드가 아닌 다른 방식으로 반복되는 동안 수정되면 ConcurrentModificationException이 발생합니다.

3) Enumeration은 Vector, Hashtable을 순회하는 데 사용되는 레거시 인터페이스입니다. Iterator는 레거시 인터페이스가 아닙니다. Iterator는 HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet 순회에 사용할 수 있습니다.


0

Enumeration은 레거시 클래스 (Vector, Stack ...)에만 사용할 수 있으며 Iterator는 모두 사용할 수 있습니다.


-1

반복기와 열거는 모두 데이터를 검색하는 데 사용됩니다. 차이점은 열거는 레거시 클래스, 즉 벡터 / 스택에만 사용할 수있는 반면 반복기는 나머지에 사용할 수 있다는 것입니다. 맵의 키 세트에 대해 열거를 사용할 수도 있습니다.


Map의 키 세트에 Enumeration을 사용할 수 있다는 것을 어디에서 보았습니까 ??
Kutzi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.