-
2022-08-23 : JAVATIL ( Today I Learned ) 2022. 8. 23. 14:38
1. HashTable, HashMap, conCurrentHashMap 차이
- HashMap, ConCurrentHashMap, HashTable 이 3가지 클래스는 Map 인터페이스를 구현한 컬렉션이다
- 기본적으로 <key,value> 구조를 가지고 있지만, key,value 값의 null 허용여부와 속도, 동기화 보장 등은 서로 조금씩 다르다.
HashMap - HashMap은 synchronized 키워드가 없기 때문에 동기화가 보장되지 못한다.
( 싱글 스레드 환경에서 사용하길 )
- 따라서 동기화처리를 하지 않기 때문에 값을 찾는 속도가 상당히 빠르다
- 또한 HashTable과 다르게 key, value null 값을 허용한다. 즉 속도가 빠르지만, 신뢰성 안전성은 떨어진다.ConCurrentHashMap - HashMap의 멀티스레드 환경에서의 동기화처리로 인한 문제점을 보완한 것이 ConCurrentHashMap이다
- 하지만 HashMap과 다르게 key, value에 null을 허용하지 않는다HashTable - HashTable의 메서드는 전부 synchronized 키워드가 붙어있기 때문에 메서드 호출 전 쓰레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해준다.
- 또한 key, value 값의 null을 허용하지 않는다.
- 즉, 동기화 락 때문에 속도는 느리지만, data의 안정성이 높고 신뢰가 높은 컬렉션이다.참고자료 : https://limkydev.tistory.com/40
2. ConcurrentHashMap putIfAbsent() 메서드
- java.util.concurrent.ConcurrentHashMap.putIfAbsent() 는 키와 값을 매개변수로 받아들이고 지정된 키가 값에 매핑되지 않은 경우 매핑하는 Java의 내장 함수
chm.putIfAbsent(key, val)
- key : 이 값이 없을 경우 val이 매핑되는 key로 적용
- value : key에 매핑될 값
EX_1)
import java.util.concurrent.*; class ConcurrentHashMapDemo { public static void main(String[] args) { ConcurrentHashMap<Integer, String> chm = new ConcurrentHashMap<Integer, String>(); chm.put(100, "Geeks"); chm.put(101, "for"); chm.put(102, "Geeks"); chm.put(103, "Gfg"); chm.put(104, "GFG"); System.out.println("Initial Mappings are: " + chm); // {100=Geeks, 101=for, 102=Geeks, 103=Gfg, 104=GFG} String returned_value = (String)chm.putIfAbsent(108, "All"); System.out.println("Returned value is: " + returned_value); // null System.out.println("New mappings are: " + chm); // {100=Geeks, 101=for, 102=Geeks, 103=Gfg, 104=GFG, 108=All} } }
- key 값이 없으면 null 값을 반환한다.
EX_2)
String returned_value = (String)chm.putIfAbsent(100, "All"); System.out.println("Returned value is: " + returned_value); // Geeks System.out.println("New mappings are: " + chm); // {100=Geeks, 101=for, 102=Geeks, 103=Gfg, 104=GFG}
- 해당 key 값이 있으면 그 key값의 value를 반환
- 기존의 ConcurrentHashMap을 변경시키지 않는다.
참고자료 : https://www.geeksforgeeks.org/concurrenthashmap-putifabsent-method-in-java/
3. Call by Value 와 Call by reference
call by value
(값에 의한 호출)- 함수가 호출 될 때 메모리 공간 안에서 임시의 공간이 생성된다.
그리고 함수가 종료되면 해당 공간은 사라진다
- 함수 호출시 전달되는 변수의 값을 복사하여 함수의 인자로 전달한다
- 복사된 인자는 함수 안에서 지역적으로 사용하는 변수이다call by reference
(참조에 의한 호출)- 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시 공간 생성 ( 함수 종료시 사라짐 )
- call by reference 참조에 의한 호출방식은 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달한다.
( 해당 변수를 가르킨다 )
- 함수 안에서 인자의 값이 변경되면, 함수 호출시에 있던 변수들도 값이 바뀐다.- JAVA의 경우 함수에 전달되는 인자의 데이터 타입에 따라서 ( 기본자료형 / 참조자료형 ) 함수 호출 방식이 달라짐
ㆍ기본 자료형 : call by value로 동작 ( int, short, long, float, double, char, boolean )
ㆍ참조 자료형 : call by reference로 동작 ( Array, Class Instance )
참고자료 : https://devlog-wjdrbs96.tistory.com/44
* JAVA는 완전한 객체 지향 언어가 아니다. 기본 자료형들이 있기 때문에...!
C++ 은 기본 자료형들도 객체로 되어있다.
'TIL ( Today I Learned )' 카테고리의 다른 글
2022-09-07 : ReactJS (0) 2022.09.07 2022-08-24 : Git & Java (0) 2022.08.24 2022-08-18 : JAVA (0) 2022.08.18 2022-08-10 : SpringBoot의 원리 및 활용 (0) 2022.08.10 2022-08-09 : Spring (0) 2022.08.09