1 minute read

String

String vs StringBuffer vs StringBuilder

클래스 가변성 Thread Safety 사용 사례
String 불변 Thread-safe 불변 문자 시퀀스를 다룰 때
StringBuffer 가변 Thread-safe 멀티스레드 환경에서 안전하게 수정할 수 있는 가변 문자 시퀀스를 다룰 때
StringBuilder 가변 Thread-safe 아님 싱글스레드 환경에서 가변 문자 시퀀스를 다룰 때

Immutable Object

  • 생성 후 상태를 바꿀 수 없는 객체

String a = "" vs String a = new String("")

  • String a = new String("") : 새로운 객체를 만드는 것으로 힙 영역에 저장된다.
  • String a = "" : 리터럴을 사용한 변수 할당으로 string constant pool 영역에 저장
String s1 = "Hello World";  
String s2 = "Hello World";  
String s3 = new String("Hello World");  
  
System.out.println(s1 == s2); // true  
System.out.println(s1.equals(s2)); // true  
  
System.out.println(s1 == s3); // false  
System.out.println(s1.equals(s3)); // true

List

Array과 유사하나, 리스트는 크기가 정해져 있지 않고 사이즈가 동적으로 변하는 배열

ArrayList vs LinkedList

  • ArrayList와 LinkedList의 주요 차이점은 다음과 같다.
클래스 데이터 구조 임의 접근 삽입/삭제 성능
ArrayList 배열 빠름 느림
LinkedList 이중 연결 리스트 느림 빠름
  • 각 자료구조의 성능 차이는 다음과 같다.
클래스 끝에 추가 중간/처음에 추가 끝에서 삭제 중간/처음에서 삭제
ArrayList 빠름 느림 빠름 느림
LinkedList 느림 빠름 느림 빠름

Map

  • Key와 Value의 한 쌍으로 이루어지는 데이터의 집합
  • 순서가 보장되지 않음
  • key 중복 비허용
  • 뛰어난 검색 속도를 가짐
  • 인덱스가 따로 존재하지 않고, iterator를 사용

HashTable vs HashMap vs LinkedHashMap vs TreeMap

  • HashTable
    • Java에서 Map 인터페이스의 레거시 구현체
    • key 혹은 value 값으로 null 불가능
    • 멀티스레드 환경에서 안전하며 동기화되어 있으나, 단일 스레드 환경에서 성능에 영향을 줄 수 있음
    • 순서 보장되지 않음
  • HashMap
    • 동기화되지 않는 맵 인터페이스의 구현체
    • 단일 스레드 환경에서 Hashtable보다 빠름
    • key 혹은 value 값으로 null 가능
    • get(), put()과 같은 기본 메소드의 성능이 O(n)
    • 순서 보장되지 않음
  • LinkedHashMap
    • 값의 입력된 순서를 유지하는 HashMap
  • TreeMap
    • 정렬된 맵 인터페이스의 구현체
    • get(), put()과 같은 기본 메소드의 성능이 O(log n)
    • value 값으로 null 가능
    • 반복 순서는 키의 자연 순서에 따라 결정된다.
  • 동기화가 필요한 경우 HashTable을 사용하고 동기화가 필요하지 않고 빠른 성능이 필요한 경우 HashMap을 사용
  • 삽입 순서를 유지해야하는 경우 LinkedHashMap을 사용하고 정렬된 맵이 필요한 경우 TreeMap을 사용

HashMap vs ConcurrentHashMap

두가지 모두 Map interface의 구현체이나, 상황에 따라 구분하여 사용하여야 한다.

  • HashMap
    • Thread-safe 하지 않은 구현체로, 멀티스레드 환경에서는 외부에서 동기화해줄 필요가 있다.
  • ConcurrentHashMap
    • Thread-safe 하지 않은 구현체
    • 외부 동기화 없이 동시 엑세스를 허용하는 동시에 모든 Map 작업이 원자적임을(atomic) 보장한다.
    • 세밀한 locking을 지원 (멀티스레드 성능 향상)
  • HashMap은 단일 스레드 환경이나 외부 동기화가 가능한 경우에 적합
  • ConcurrentHashMap은 맵에 대한 동시 액세스가 필요한 멀티 스레드 환경에 적합

Leave a comment