Java 3

[Java] fail-fast vs weakly consistent iterator

자바 컬렉션 프레임워크에서 Map 인터페이스와 관련된 내용을 찾다보면 fail-fast와 fail-safe iterator에 대한 내용이 자주 보인다. 이 주제는 Concurrency(동시성)과 관련이 있는데, Map의 대표적인 구현 클래스인 HashMap의 요소를 for-each문 내부에서 변경할 경우 ConcurrentModificationException을 던지는 것을 한번쯤은 경험해봤을 것이다. 이 예외를 처음 경험한게 코딩테스트 도중이었기에 적잖이 당황했던 기억이 있기에 이번 기회에 정리하고자 한다. HashMap에서의 ConcurrentModificationException 예시 private HashMap map; // 특정 카테고리를 제외한 모든 요소 삭제 public void clear(..

Java 2021.12.20

[Java] jenv로 자바 버전 쉽게 변경하기

java -version과 javac -version이 다르게 표시될 때 터미널에서 java -version과 javac -version을 실행했을 때 Java(JDK)의 버전이 다르게 표시되는 경우가 있다. 개인적으론 특정 버전 설치와 변경이 편리한 jenv를 이용하는 두 번째 방법을 개인적으로 추천한다. 방법 1 먼저 /usr/libexec/java_home -V을 실행하면 다음과 같이 출력이 된다. Matching Java Virtual Machines (3): 15.0.2 (x86_64) "AdoptOpenJDK" - "AdoptOpenJDK 15" /Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home 1.8.0_311 (x86_..

Java 2021.12.19

[Java] String, StringBuilder, StringBuffer의 차이점

Java를 공부하다보면 String은 불변(immutable) 객체라는 이야기를 많이 듣게 된다. String text = "Java"; text = text + " String"; System.out.println(text); // Java String 아니 위 코드처럼 String 값이 잘만 변하는데 무슨 말이야! 라고 생각될 수 있지만 Java의 String 객체는 변하지 않는다. 객체가 불변일 경우 멀티 쓰레드 환경에서 값이 변경될 일이 없이 때문에 자연스럽게 Thread safe하게 된다. JDK 5 이전에는 String 문자열을 더하면 새로운 String 객체가 생성되고, 기존 객체는 쓰레기가 되어 나중에 GC(Garbage Collection)의 대상이 되었다. 이것이 반복되면 쓰레기가 계속..

Java 2021.12.17