HashMap, HashTable, ConcurrentHashMap 차이
모두 Map 인터페이스의 구현체
HashMap
- key와 value에 null을 허용한다.
- 동기화를 보장하지 않는다.
- thread-safe하지 않아 싱글 스레드 환경에서 사용하는 것이 좋다.
- 속도는 빠르지만, 신뢰성과 안정성이 떨어진다.
HashTable
- key와 value에 null을 허용하지 않는다.
- 동기화를 보장한다.
- thread-safe하기 때문에, 멀티 스레드 환경에서 사용할 수 있다.
- 데이터 무결성을 보장한다.
ConcurrentHashMap
- key와 value에 null을 허용하지 않는다.
- 동기화를 보장한다.
- thread-safe하기 때문에, 멀티 스레드 환경에서 사용할 수 있다.
- HashTable보다 성능이 좋다.
(HashTable은 메소드마다 락을 걸어 데이터를 다루는 속도가 느리다.
이와 달리, ConcurrentHashMap은 각 세그멘트마다 락을 걸어 데이터를 다루는 속도가 빠르다.)
Java immutable Object
불변객체는 재할당 가능하지만, 한 번 할당하면 내부 데이터를 변경할 수 없는 객체
불변 객체는,
setter 메소드를 사용하지 않는다.
모든 필드를 final과 private를 사용해서 선언한다.
불변 객체는 값이 불변이기 때문에 멀티스레드 환경에서 thread-safe하다.
String jisin = "aaa";
jisin = "bbb";
jisin이라는 객체를 생성한 후, 해당 객체에 다른 값을 할당했다.
이것은 String 객체의 값이 변경된 것이 아닌 새로운 String 객체가 생성되어 그 참조가 jisin에 할당된 것이다.
즉, "aaa"와 "bbb" 각각의 인스턴스가 Heap 영역에 저장된 것이다.
리터럴과 new 연산자
리터럴 : String s1 = "abc";
new : String s1 = new String("abc");
리터럴을 이용하면 String Constant Pool 영역에 할당되고,
new를 이용하면 메모리 Heap 영역에 할당된다.
new는 반복해서 사용하면 그만큼 새로운 것이 할당되므로 메모리 낭비가 될 수도 있다.
Java Garbage Collector
Generic
'객체지향(Java)' 카테고리의 다른 글
Java 자바 기술면접 질문 정리 (1) (0) | 2022.12.08 |
---|---|
객체지향의 사실과 오해 부록A. 추상화 기법 (2) (0) | 2022.11.26 |
객체지향의 사실과 오해 부록A. 추상화 기법 (1) (0) | 2022.11.25 |
객체지향의 사실과 오해 4장. 역할, 책임, 협력 (0) | 2022.11.23 |