728x90
* 아래 링크를 참고하여 번역 및 내용을 추가하여 정리하였습니다.
Java에서 forEach를 사용하다가 궁금한 점이 생겨 검색해보았는데 마침 정리가 잘 된 글이 있어 정리해서 공유해본다.
Collection.stream().forEach() 와 Collection.forEach()의 차이점을 알아보자.
두 방식은 크게 다르지 않고 같은 결과를 출력하지만 내부 동작 방식에 몇 가지 차이점이 있다.
Collection.stream().forEach()
- Collection객체를 스트림으로 변환 후 collection의 stream에서 반복한다.
- 반복할 때마다 collection에 구조적 변경이 일어나면 iterator가 완료된 후 concurrent modification exception이 발생한다.
- 동기화된 컬렉션에 반복이 발생하더라도 lock이 걸리지 않는다.
Collection.forEach()
- Collection 자체의 iterator를 사용한다.
- 반복이 일어나는 동안 구조적 변경을 허용하지 않는다. element를 추가하거나 제거하는 등의 collection에 변경이 일어날 경우 즉시 concurrent modification error를 던진다.
- Collection.forEach()는 동기화된 컬렉션에서 반복이 일어나면 lock이 걸린다.
foreach안에서 collection 수정이 발생할 경우 결과 비교
// Collection 생성
List<String> fruits = new ArrayList<String>();
fruits.add("apple");
fruits.add("banana");
fruits.add("peach");
1) Collection.stream().forEach()
fruits.stream().forEach(e -> {
System.out.println(e);
fruits.add("Collection.stream().forEach()");
});
// 실행결과 - forEach가 모두 실행되고 난 후 에러 발생
apple
banana
peach
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList.forEach(ArrayList.java:1542)
at test.java.CollectionTest.main(CollectionTest.java:20)
2) Collection.forEach()
fruits.forEach(e -> {
System.out.println(e);
fruits.add("Collection.forEach()");
});
// 실행결과 - 즉시 에러 발생
apple
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList.forEach(ArrayList.java:1542)
at test.java.CollectionTest.main(CollectionTest.java:20)
728x90
'백엔드' 카테고리의 다른 글
[Java] Collection - 2. ArrayList와 Vector (0) | 2022.07.06 |
---|---|
[Java] Collection - 1. Collection Framework (0) | 2022.07.05 |
[Java] 2. Garbage Collection - GC의 과정 및 종류 (0) | 2022.06.24 |
[Java] 1. Garbage Collection이란? GC의 핵심 및 과정 (0) | 2022.06.24 |
[Java/Postgresql] 랜덤 문자열 생성 - get_random_string() (0) | 2022.03.21 |
댓글