728x90
JAVA | HashMap에서 ConcurrentModificationException 발생
- HashMap<String, Integer> 을 선언해서, 각 닉네임 별로 중복 개수 카운팅 해둔 뒤,
- for(String key : map.keySet()) {}으로 내부에서 if(map.get(key)==1) 인 경우, 현재 map에서 해당 key를 Remove() 처리 하는 과정에서 발생한 오류이다.
- 이유는 ‘동시 수정 에러’ 이다. 즉, 기존 map에 존재하는 상태로 remove 하면서 계속 for문을 돌려니, 서로 다른 Thread가 같은 HashMap에 대한 연산을 수행하면서 충돌한 오류인 것이다.
⬛ 해결 1. 아예 keyMap의 key만 복제한 String[] 배열을 따로 만들기.
- 이렇게 하면, 접근하는 keyArr와 삭제 대상인 map이 구분이 되므로 동시 수정 에러가 발생하지 않는다.
String[] keyArr = map.keySet().toArray(new String[map.size()]);
for(String key : keyArr){
if(map.get(key)==1) map.remove(key);
}
⬛ 해결 2. CurrentHashMap으로 기존 HashMap 선언을 대체한다.
- 이거는 동시 수정이 가능하도록 만들어진 HashMap이라서 함께 접근해도 문제되지 않고 정상 실행된다.
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
for(String key : map.keySet()){
if(map.get(key) == 1) map.remove(key);
}
728x90
'코딩 테스트 [준비] > JAVA | 활용할 문법 정리' 카테고리의 다른 글
JAVA | ArrayList에 remove() 처리 시 주의할 점 (100) | 2024.01.29 |
---|---|
JAVA | 객체 비교하기 - equals()와 hashCode() 재정의 (43) | 2023.12.22 |
JAVA | Deque - Double-ended-queue (덱/데크) 사용법 (0) | 2023.08.14 |
JAVA | 구분자 여러개일 때 split() 정규식으로 뽑는 방식 (0) | 2023.07.21 |
JAVA | 알파벳, 대/소문자 확인하는 방법 | isUpperCase(), isLowerCase(), isAlphabetic() (0) | 2023.07.21 |