우리는 Java에 네 가지 커서가 있다는 것을 알고 있습니다: Enumeration, Iterator, ListIterator 및 Spliterator. 이전 포스트에서 Enumeration 및 Iterator 커서에 대해 이미 논의했습니다. 이 게시물을 읽기 전에 이전 게시물을 확인하십시오: Java Iterator. 이 게시물에서는 세 번째 Java 커서에 대해 논의할 것입니다: ListIterator.
Java ListIterator
Iterator와 마찬가지로 ListIterator는 List 구현 객체에서 요소를 하나씩 반복하는 데 사용되는 Java Iterator입니다.
- Java 1.2 이후로 사용할 수 있습니다.
- Iterator 인터페이스를 확장합니다.
- List 구현 클래스에만 유용합니다.
- Iterator와 달리 CRUD(생성, 읽기, 업데이트 및 삭제) 네 가지 작업을 모두 지원합니다.
- Iterator와 달리 앞뒤 방향 반복을 지원합니다.
- 양방향 Iterator입니다.
- 현재 요소가 없으며, 커서 위치는 항상 previous() 호출에 의해 반환되는 요소와 next() 호출에 의해 반환되는 요소 사이에 있습니다.
참고:- Collection API에서 CRUD 작업이란 무엇입니까?
- CREATE: Collection 객체에 새 요소 추가.
- READ: Collection 객체에서 요소 검색.
- 업데이트: Collection 객체에서 기존 요소를 업데이트하거나 설정합니다.
- 삭제: Collection 객체에서 요소를 제거합니다.
Java ListIterator 클래스 다이어그램
Java에서 ListIterator는 Collection API의 인터페이스입니다. Iterator 인터페이스를 확장합니다. 전방 및 후방 반복 및 CRUD 작업을 지원하기 위해 다음과 같은 메서드가 있습니다. ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector 등과 같은 모든 List 구현 클래스에이 Iterator를 사용할 수 있습니다. 다음 섹션에서 이러한 메서드를 자세히 살펴보겠습니다. 일부 유용한 메서드도 함께 제공됩니다.
Java ListIterator 메서드
Java ListIterator 인터페이스에는 다음과 같은 메서드가 있습니다.
- void add(E e): 지정된 요소를 목록에 삽입합니다.
- boolean hasNext(): 전방 방향으로 목록을 탐색할 때이 목록 반복자에 더 많은 요소가있는 경우 true를 반환합니다.
- boolean hasPrevious(): 역방향으로 목록을 탐색할 때이 목록 반복자에 더 많은 요소가있는 경우 true를 반환합니다.
- E next(): Returns the next element in the list and advances the cursor position.
- int nextIndex(): 다음 next() 호출에 의해 반환될 요소의 인덱스를 반환합니다.
- E previous(): Returns the previous element in the list and moves the cursor position backwards.
- int previousIndex(): 이전() 호출에 의해 반환될 요소의 인덱스를 반환합니다.
- void remove(): 다음() 또는 previous()에 의해 마지막으로 반환된 요소를 목록에서 제거합니다.
- void set(E e): 다음() 또는 previous()에 의해 마지막으로 반환된 요소를 지정된 요소로 바꿉니다.
이후 섹션에서는 유용한 예제와 함께 이러한 메서드를 하나씩 살펴보겠습니다.
Java ListIterator 기본 예제
이 섹션에서는 몇 가지 ListIterator 메서드에 대해 몇 가지 예제를 살펴보겠습니다. 먼저이 반복자 객체를 얻는 방법에 대해 이해해야 합니다. ListIterator를 어떻게 얻을까요?
ListIterator<E> listIterator()
이 목록의 요소 위에있는 목록 반복자를 반환합니다. 예제:-
import java.util.*;
public class ListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// ListIterator 얻기
ListIterator<String> namesIterator = names.listIterator();
// 요소 트래버스
while(namesIterator.hasNext()){
System.out.println(namesIterator.next());
}
// 여기에서 내부 반복자를 만듭니다. 향상된 for 루프.
for(String name: names){
System.out.println(name);
}
}
}
출력:-
Rams
Posa
Chinni
ListIterator 양방향 반복 예제
섹션에서는 ListIterator의 메서드가 어떻게 전방 및 후방 반복을 수행하는지 탐색할 것입니다.
import java.util.*;
public class BiDirectinalListIteratorDemo
{
public static void main(String[] args)
{
List();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// ListIterator 가져오기
ListIterator<String> listIterator = names.listIterator();
// 요소 트래버스
System.out.println("Forward Direction Iteration:");
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
// 요소 트래버스, the iterator is at the end at this point
System.out.println("Backward Direction Iteration:");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
출력:-
Forward Direction Iteration:
Rams
Posa
Chinni
Backward Direction Iteration:
Chinni
Posa
Rams
Java 반복자 유형
우리가 알다시피 Java에는 네 가지 커서가 있습니다: Enumeration, Iterator, ListIterator 및 Spliterator. 이를 아래에 표시된 두 가지 주요 유형으로 분류할 수 있습니다:
- 단방향 반복자
전방 반복만 지원하는 커서입니다. 예를 들어, Enumeration, Iterator 등이 있습니다.- 양방향 반복자
전방 및 후방 반복을 모두 지원하는 커서입니다. 예를 들어, ListIterator는 양방향 반복자입니다.
Java ListIterator의 내부 작동 방식은?
우리가 알다시피 Java ListIterator는 양방향으로 작동합니다. 즉, 전방 및 후방 방향으로 작동합니다. 이는 양방향 반복자입니다. 이 기능을 지원하기 위해 두 세트의 메서드가 있습니다.
- 전방 반복 방법
전방 반복을 지원하기 위해 다음 메서드를 사용해야 합니다:
- hasNext())
- next()
- nextIndex()
- 후방 반복 방법
후방 반복을 지원하기 위해 다음 메서드를 사용해야 합니다:
- hasPrevious()
- previous()
- previousIndex()
이전 게시물에서 “Java Iterator의 내부 작동 방식” 섹션에서 Iterator가 내부적으로 전진 방향으로 작동하는 방법에 대해 이미 설명했습니다. 심지어 ListIterator도 같은 방식으로 작동합니다. 이전 게시물을 확인하려면 여기를 클릭하세요: Java Iterator. 이 섹션에서는 ListIterator가 후방 방향으로 작동하는 방법에 대해 설명하겠습니다. 다음 LinkedList 객체를 살펴보고 이 기능을 이해해 봅시다.
List<String> names = new LinkedList<>();
names.add("E-1");
names.add("E-2");
names.add("E-3");
.
.
.
names.add("E-n");
이제 다음과 같이 LinkedList에 ListIterator 객체를 생성합니다:
ListIterator<String> namesIterator = names.listLterator();
“namesIterator” ListIterator가 다음과 같이 보인다고 가정해 봅시다: 여기서 ListIterator의 커서는 목록의 첫 번째 요소 앞을 가리킵니다. 이제 다음 코드 스니펫을 while 루프에서 실행합니다.
namesIterator.hasNext();
namesIterator.next();
위의 코드 스니펫을 while 루프에서 실행하면 ListIterator의 커서가 LinkedList의 마지막 요소를 가리킵니다. 그런 다음 다음 코드 스니펫을 실행하여 끝에서 시작까지 순회를 시작할 수 있습니다.
namesIterator.hasPrevious();
namesIterator.previous();
위의 코드 스니펫을 실행하면 ListIterator의 커서는 위의 다이어그램에 표시된대로 List의 “마지막에서 두 번째” 요소를 가리킵니다. LinkedList의 첫 번째 요소에 ListIterator의 커서를 이동하기 위해이 프로세스를 수행하십시오.
첫 번째 요소를 읽은 후 아래의 코드 스니펫을 실행하면 “false”값을 반환합니다.
namesIterator.hasPrevious();
ListIterator의 커서가 LinkedList의 첫 번째 요소 앞에 위치하므로 hasPrevious() 메서드는 false 값을 반환합니다. 이 모든 다이어그램을 관찰한 후에는 Java ListIterator가 아래의 다이어그램에 표시된대로 양방향 반복을 지원한다고 말할 수 있습니다. 그래서 이것은 양방향 커서로도 알려져 있습니다. 정방향 ListIterator
역방향 ListIterator
ListIterator의 장점
Iterator와 달리 ListIterator는 다음과 같은 장점이 있습니다:
- Iterator와 마찬가지로 읽기 및 삭제 작업을 지원합니다.
- 생성 및 업데이트 작업도 지원합니다.
- 그것은 CRUD 작업을 지원한다는 것을 의미합니다. CREATE, READ, UPDATE, DELETE 작업을 지원합니다.
- 전진 방향 및 후진 방향 반복을 지원합니다. 즉, 양방향 Java 커서입니다.
- 메소드 이름은 간단하고 사용하기 쉽습니다.
ListIterator의 제한사항
Iterator와 비교하여, Java ListIterator는 많은 장점을 가지고 있습니다. 그러나 아래와 같은 몇 가지 제한사항이 있습니다.
- 이것은 Iterator만 지원하는 List 구현 클래스입니다.
- Iterator와 달리 전체 Collection API에 적용할 수 없습니다.
- 일반적인 Java 커서가 아닙니다.
- Spliterator와 비교하여, 요소들의 병렬 반복을 지원하지 않습니다.
- Spliterator와 비교하여, 대량 데이터를 반복하는 데 더 나은 성능을 지원하지 않습니다.
Iterator와 ListIterator의 유사점
이 섹션에서는 Java의 두 가지 커서인 Iterator와 ListIterator의 유사점에 대해 논의하겠습니다.
- 둘 다 Java 1.2에서 소개되었습니다.
- 둘 다 Collection 또는 List 요소를 반복하는 데 사용되는 Iterators입니다.
- 모두 READ 및 DELETE 작업을 지원합니다.
- 모두 순방향 반복을 지원합니다.
- 둘 다 레거시 인터페이스가 아닙니다.
Iterator와 ListIterator의 차이점
이 섹션에서는 Java 두 개의 반복자인 Iterator와 ListIterator의 차이점을 논의할 것입니다.
Iterator | ListIterator |
---|---|
Introduced in Java 1.2. | Introduced in Java 1.2. |
It is an Iterator for whole Collection API. | It is an Iterator for only List implemented classes. |
It is an Universal Iterator. | It is NOT an Universal Iterator. |
It supports only Forward Direction Iteration. | It supports both Forward and Backward Direction iterations. |
It’s a Uni-Directional Iterator. | It’s a Bi-Directional Iterator. |
It supports only READ and DELETE operations. | It supports all CRUD operations. |
We can get Iterator by using iterator() method. | We can ListIterator object using listIterator() method. |
이것이 Java에서의 ListIterator에 관한 모든 것입니다. 이 Java ListIterator 이론과 예제들이 ListIterator 프로그래밍을 시작하는 데 도움이 되기를 바랍니다. 참고: ListIterator API 문서
Source:
https://www.digitalocean.com/community/tutorials/java-listiterator