Study/java

[Java] Collection - iterator : 순회, 반복

iterator()

iterator() 메소드는 컬렉션 인스턴스에서 Iterator 객체를 가져오는 함수입니다.

Iterator 클래스를 사용하면 컬렉션을 반복할 수 있게 됩니다.

이 메소드는 모든 Collection 객체에 선언된 메소드는 아닙니다.

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Main {
	public static void main(String[] args) {
		Set<Integer> set = new HashSet<>();
		set.add(1);
		set.add(2);
		set.add(3);
		
		Iterator<Integer> it = set.iterator();
		while (it.hasNext()) {
		    System.out.println(it.next());
		}
	}
}

 

iterator를 사용한 순회

공식문서에 따르면 순서없는 컬렉션의 경우(ex. set) iterator의 순서는 보장하지 않는다고 합니다.

Set은 순서 없는 컬렉션이지만 위의 예제에서는 순서대로 출력하고 있습니다.

 

 

 

 

찾아본 결과, 순서를 보장하지 않는 경우가 있긴 합니다.

Map<String, String> map = new HashMap<>();
map.put("aaa", "111");
map.put("bbb", "222");
map.put("ccc", "333");
map.put("ddd", "444");
map.put("eee", "555");
map.put("fff", "666");

Iterator<String> keyIterator = map.keySet().iterator();
while (keyIterator.hasNext()) {
    System.out.println(map.get(keyIterator.next()));
}

순서가 보장되지 않음

코드 출처

 

Set 자체는 순서를 보장하지 않는 컬렉션이지만, 위의 예제처럼 iterator를 사용했을 때 등록 순서대로 출력이 되는 것을 확인할 수가 있습니다.

Map은 keySet을 가져와서 iterator를 사용했을 때 등록된 순서대로 나오지 않습니다.

이유는 정확히 잘 모르겠지만, Map의 keySet의 iterator와 Set의 iterator는 내부에 구현된 로직이 다를 것으로 예상이 됩니다.

어쩌면 Set의 iterator도 순서를 보장하는 것처럼 보이지만 보장하지 않을 수도 있습니다.

 

그 외에 컬렉션 객체의 요소를 삭제할 때 iterator를 사용하여 삭제하면 for문과 for-loop문을 사용할 때 발생하는 오류를 예방할 수 있습니다.