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
존재하지 않는 키의 값. putIfAbsent
contracty 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
가 되다3
이 3
이미 지도에 있어요.
언급URL : https://stackoverflow.com/questions/48183999/what-is-the-difference-between-putifabsent-and-computeifabsent-in-java-8-map
'programing' 카테고리의 다른 글
컨피규레이션파일 비밀번호 암호화 (0) | 2022.09.21 |
---|---|
gmtime()의 시간 + 날짜 출력에서 epoch 이후의 초수를 얻는 방법은 무엇입니까? (0) | 2022.09.21 |
CSV MIME 타입의 사용 방법 (0) | 2022.09.21 |
동적으로 PHP과 QR코드 생성. (0) | 2022.09.21 |
JWT를 ReactJs와 함께 localStorage에 저장해도 안전합니까? (0) | 2022.09.21 |