programing

Java 8 Map의 putIfAbsent와 computeIfAbsent의 차이점은 무엇입니까?

nicescript 2022. 9. 21. 22:21
반응형

Java 8 Map의 putIfAbsent와 computeIfAbsent의 차이점은 무엇입니까?

흥미로운 기사를 읽고 두 기능의 차이는 다음과 같습니다.

두 기능 모두 지정된 키가 Map에 아직 존재하지 않는 경우 요소를 추가하려고 합니다.

putIfAbsent는 지정된 값을 가진 요소를 추가하는 반면 computeIfAbsent는 키를 사용하여 계산된 값을 가진 요소를 추가합니다.http://www.buggybread.com/2014/10/java-8-difference-between-map.html

그리고.

putIfAbsent는 if-statement를 정의해야 하는 필수 방법을 없애지만 Java 문서를 가져오는 것이 우리의 성능을 정말로 해칠 경우에는 어떻게 해야 할까요?

이것을 최적화하기 위해서, 정말로 필요한 것이 확실해질 때까지 기사를 취득하고 싶지 않습니다.즉, 기사를 취득하기 전에 키가 없는지를 확인할 필요가 있습니다.http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/

이 두 가지 기능에 대해 좀 더 자세히 설명해 주시겠습니까?

차이점 #1

computeIfAbsent 는 매핑 함수를 사용합니다.이 함수는 키가 없을 때 값을 얻기 위해 호출됩니다.

putIfAbsent 값을 직접 가져옵니다.

취득할 수 .putIfAbsent키가 이미 존재하는 경우 이 키를 낭비합니다.

"비싼" 값입니다.new ArrayList<>()때 글이에요.Map<K, List<V>>키가 이미 존재하는 경우(그 후 새 목록이 폐기됨) 새 목록을 생성하면 불필요한 가비지가 생성됩니다.


차이점 #2

computeIfAbsent 는 지정된 키와 관련된 현재(기존 또는 계산된) 값을 반환합니다.계산된 값이 늘인 경우 늘입니다.

putIfAbsent 지정된 키와 관련된 이전 값 또는 키에 대한 매핑이 없는 경우 null을 반환합니다.

키가 이미 에는 반환됩니다.computeIfAbsent값을 하고, 는 계산값을 반환한다.putIfAbsent


차이점 #3

두 방법 모두 키가 없거나 기존 값이 null인 것으로 "부재"를 정의합니다.

computeIfAbsent 키가 없는 경우 null 값은 입력되지 않습니다.

putIfAbsent 키가 없는 경우 값이 늘인 경우에도 값은 저장됩니다.

에의 향후 콜, 및 콜에는 영향을 주지 않지만,및 등의 콜에는 영향이 있습니다.

, '우리'가 가정해 주세요.Map<String,ValueClass>.

map.putIfAbsent("key", new ValueClass());

will a a a가 생성됩니다.ValueClass('key'이미 에 있는 Map이렇게 하면 불필요한 인스턴스가 생성될 뿐입니다.

반면에

map.computeIfAbsent("key", k -> new ValueClass());

에서는, 「만들다」라고 하는 것 밖에 생성되지 않습니다.ValueClass " instance "key"에 )Map 에 ).null값)을 설정합니다.

따라서 '''는computeIfAbsent보다 효율적입니다.

putIfAbsent과 같습니다.

ValueClass value = new ValueClass();
if (map.get("key") == null) {
    map.put("key",value);
}

동시에computeIfAbsent과 같습니다.

if (map.get("key") == null) {
    map.put("key",new ValueClass());
}

두 방법의 또 다른 작은 차이점은computeIfAbsent 붙이지 않다null존재하지 않는 키의 값. putIfAbsentcontracty underbanda 。

메서드 시그니처를 주의 깊게 보면 차이를 이해할 수 있습니다.

  • putIfAbsent는 키와 값을 가져와 맵에 해당 키의 값이 없는 경우 해당 값을 맵에 배치합니다.
  • computeIfAbsent와 「」를 합니다.Function맵에 해당 키에 대한 값이 없는 경우 함수를 호출하여 값을 만든 후 맵에 넣습니다.

이미 되어 있는 는, 「」를 합니다.putIfAbsent.

아직 있지 않고 하는 것은 드는 작업들어함인 경우 " " "를 사용합니다.computeIfAbsent따라서 맵에 지정된 키의 값이 이미 포함되어 있는 경우 비싼 작업을 수행할 필요가 없습니다.

디폴트 실장은 좀 더 명확하게 할 수 있을 것 같습니다.

default V putIfAbsent​(K key, V value)의 디폴트 은 다음과 같습니다.

 V v = map.get(key);
  if (v == null)
      v = map.put(key, value);
  return v;

한편, 다음과 같습니다.

default V computeIfAbsent​(K key,
                          Function<? super K,? extends V> mappingFunction)

는 다음과 같습니다.

if (map.get(key) == null) {
     V newValue = mappingFunction.apply(key);
     if (newValue != null)
         map.put(key, newValue);
}

이 질문은 이미 답변이 끝난 상태입니다.조금 시간을 들여서 이해했습니다(「computeIfAbsent」에 지정된 키의 값이 맵에 이미 포함되어 있는 경우는, 고액의 조작을 실시할 필요는 없습니다).이해는 여기에 기재합니다.이것이 다른 사람들에게 도움이 되기를 바랍니다.

putIfAbsent()하게 put()지정한 키의 값이 맵에 이미 포함되어 있는 경우. putIfAbsent()는 키가 늘인지 아닌지만 확인합니다.을 다시.null은 합니다.

,에서는computeIfAbsent()늘 그렇듯이값의 늘 체크 중 늘이 아닌 경우 맵개체의 기존 값이 newValue에 할당되어 반환됩니다.따라서 맵의 기존 값이 재사용되므로 값을 다시 가져올 필요가 없습니다.

다음의 프로그램을 참조해 주세요.

public class MapTest1 {
    public static final String AJAY_DEVGAN = "Ajay Devgn";
    public static final String AUTOBIOGRAPHY = "Autobiography";
    
    public static void main(String[] args) {
        MapTest1 mt = new MapTest1();
        mt.testPutCompute();
    }

    private void testPutCompute() {
        Map<String, List<String>> movies = getMovieObject();
        System.out.println("\nCalling putIfAbsent method.....");
        //System.out.println(movies.get(AJAY_DEVGAN));
        //movies.put(AJAY_DEVGAN, getAjayDevgnMovies());
        movies.putIfAbsent(AJAY_DEVGAN, getAjayDevgnMovies());
        
        System.out.println("\nCalling computeIfAbsent method......");
        //System.out.println(movies.get(AUTOBIOGRAPHY));
        movies.computeIfAbsent(AUTOBIOGRAPHY, t -> getAutobiographyMovies());
        
    }

    private Map<String, List<String>> getMovieObject() {
        Map<String, List<String>> movies = new HashMap<>();     

        movies.put(AJAY_DEVGAN, getAjayDevgnMovies());
        movies.put(AUTOBIOGRAPHY, getAutobiographyMovies());
        
        System.out.println(movies);
        return movies;
    }

    private List<String> getAutobiographyMovies() {
        System.out.println("Getting autobiography movies");
        List<String> list = new ArrayList<>();
        list.add("M.S. Dhoni - The Untold Story");
        list.add("Sachin: A Billion Dreams");
        return list;
    }

    private List<String> getAjayDevgnMovies() {
        System.out.println("Getting Ajay Devgn Movies");
        List<String> ajayDevgnMovies = new ArrayList<>();
        ajayDevgnMovies.add("Jigar");
        ajayDevgnMovies.add("Pyar To Hona Hi Tha");
        return ajayDevgnMovies;
    }
}

다음 코드를 참조해 주세요.putIfAbsent()그리고.computeIfAbsent()인터페이스로부터의Map.class

public interface Map<K,V> {
.....

 default V putIfAbsent(K key, V value) {
        V v = get(key);
        if (v == null) {
            v = put(key, value);
        }

        return v;
    }
    
 default V computeIfAbsent(K key,
            Function<? super K, ? extends V> mappingFunction) {
        Objects.requireNonNull(mappingFunction);
        V v;
        if ((v = get(key)) == null) {
            V newValue;
            if ((newValue = mappingFunction.apply(key)) != null) {
                put(key, newValue);
                return newValue;
            }
        }

        return v;
    }   
.........
}

V putIfAbsent(K key, V value)- 지정된 키가 값과 아직 관련되어 있지 않은 경우(또는 null로 매핑되어 있는 경우)는 지정된 매핑 함수를 사용하여 값을 계산하고 null이 아닌 한 이 맵에 입력합니다.

V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)되어 있지 않은 null에 있는 경우),는 null을 하고 이 는 null을 제외하고 이 맵에 입력합니다( null을 null로 합니다).

설명서를 읽으면 더 명확한 답을 얻을 수 있습니다.https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

를 들겠습니다.putIfAbsent():

Map myMap = new HashMap();
myMap.put(1,"ABC");
myMap.put(2,"XYZ");
myMap.put(3,"GHI");
//Output of map till this point is : 1-> "ABC", 2-> "XYZ", 3-> "GHI"
myMap.putIfAbsent(3,"cx");
//Output of map till this point is : 1-> "ABC", 2-> "XYZ", 3-> "GHI"

cx가 되다33이미 지도에 있어요.

언급URL : https://stackoverflow.com/questions/48183999/what-is-the-difference-between-putifabsent-and-computeifabsent-in-java-8-map

반응형