ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022-08-23 : JAVA
    TIL ( 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

    댓글

Designed by Tistory.