TIL ( Today I Learned )

2022-08-23 : JAVA

PHM 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++ 은 기본 자료형들도 객체로 되어있다.