이 두 인터페이스의 정확한 차이점은 무엇입니까? 않는 Enumeration
사용을 통해 혜택을 Iterator
? 누구든지 자세히 설명해 주시면 참조 기사를 주시면 감사하겠습니다.
이 두 인터페이스의 정확한 차이점은 무엇입니까? 않는 Enumeration
사용을 통해 혜택을 Iterator
? 누구든지 자세히 설명해 주시면 참조 기사를 주시면 감사하겠습니다.
답변:
Iterator
인터페이스 에 대한 Java API 사양을 보면 다음 과 같은 차이점에 대한 설명이 있습니다 Enumeration
.
반복자는 두 가지면에서 열거 형과 다릅니다.
- 반복자를 사용하면 호출자가 잘 정의 된 의미 체계를 사용하여 반복하는 동안 기본 컬렉션에서 요소를 제거 할 수 있습니다.
- 메서드 이름이 개선되었습니다.
결론은, 모두 Enumeration
와 Iterator
연속적인 요소를 제공하지만, 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 사용을 고려해야합니다.
Enumeration과 Iterator에는 기본적인 세 가지 차이점이 있습니다.
열거
1 만 lagacy 클래스의 사용 (예. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. 읽기 작업을 수행 할 수 있지만 요소를 제거 할 수 없습니다.
3. 두 가지 방법을 사용할 수 있습니다
반복자
모든 컬렉션에 적용 가능
Iterator itr = c.iterator();
where c is any `Collection` class
읽기 및 제거 작업을 수행 할 수 있습니다.
세 가지 방법을 사용할 수 있습니다.
둘 다의 한계
Add object
및 없다Replace object
주요 차이점은 Enumeration이 remove () 메서드를 노출하지 않는다는 것입니다. 또한 Iterator는 기본 개체에 대한 탐색 및 수정을 동시에 허용하지 않습니다. 동시 수정 여부를 확인하는 제어 권한이 있으므로 더 많은 처리가 필요합니다. 따라서 Enumeration의 성능은 Iterator보다 거의 50 % 더 빠릅니다. 이러한 동기화를 무시하고 탐색 만 필요하면 열거 형을 사용하십시오.
1) Iterator와 Enumeration의 주요 차이점은 컬렉션을 탐색하는 동안 요소를 제거하는 것입니다. Iterator는 remove () 메서드가 있으므로 컬렉션을 순회하는 동안 요소를 제거 할 수 있습니다. 열거 형에는 remove () 메서드가 없습니다.
2) 열거는 본질적으로 안전합니다. 순회 중에 Collection이 수정되면 ConcurrentModificationException을 발생시키지 않습니다. Iterator는 본질적으로 오류가 발생하지 않습니다. 컬렉션이 자신의 remove () 메서드가 아닌 다른 방식으로 반복되는 동안 수정되면 ConcurrentModificationException이 발생합니다.
3) Enumeration은 Vector, Hashtable을 순회하는 데 사용되는 레거시 인터페이스입니다. Iterator는 레거시 인터페이스가 아닙니다. Iterator는 HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet 순회에 사용할 수 있습니다.