[java] Java Enumeration과 Iterator의 차이점

이 두 인터페이스의 정확한 차이점은 무엇입니까? 않는 Enumeration사용을 통해 혜택을 Iterator? 누구든지 자세히 설명해 주시면 참조 기사를 주시면 감사하겠습니다.



답변

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

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

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

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

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

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


답변

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


답변

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

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

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


답변

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


답변

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

답변

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

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


답변

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