ConcurrentHashMap putIfAbsent () renvoie la valeur null

Le programme suivant imprime NULL. Je ne suis pas capable de comprendre pourquoi.

public class ConcurrentHashMapTest { public static final ConcurrentMap map = new ConcurrentHashMap(5, 0.9f, 2); public static void main(String[] args) { map.putIfAbsent("key 1", "value 1"); map.putIfAbsent("key 2", "value 2"); String value = get("key 3"); System.out.println("value for key 3 --> " + value); } private static Ssortingng get(final Ssortingng key) { return map.putIfAbsent(key, "value 3"); } } 

Est-ce que quelqu’un pourrait m’aider à comprendre le comportement?

ConcurrentMap.putIfAbscent renvoie la valeur précédente associée à la clé spécifiée ou la valeur null s’il n’y avait pas de mappage pour la clé. Vous n’aviez pas de valeur associée à “clé 3”. Tout bon

Le problème est que, par définition, putIfAbsent renvoie l’ancienne valeur et non la nouvelle valeur (l’ancienne valeur pour absent est toujours nulle). Utilisez computeIfAbsent – cela renverra une nouvelle valeur pour vous.

 private static Ssortingng get(final Ssortingng key) { return map.computeIfAbsent(key, s -> "value 3"); } 

putIfAbsent() renvoie la valeur précédente associée à la clé spécifiée, ou la valeur null s’il n’y a pas eu de mappage pour la clé et parce que la key 3 n’est pas présente dans la carte et renvoie donc la valeur null .

Vous avez ajouté les key 1 et key 2 dans la carte, mais la key 3 n’est associée à aucune valeur. Donc, vous obtenez un null . putIfAbsent() key 3 avec une valeur et putIfAbsent() retournera la valeur précédente associée à cette clé.

Comme si la carte contenait déjà la key 3 associée à la valeur A

 key 3 ---> A 

Ensuite, en appelant map.putIfAbsent("key 3","B") retournera A

C’est une question fréquemment posée, qui suggère peut-être que ce comportement n’est pas intuitif. Peut-être que la confusion vient de la façon dont dict.setdefault () fonctionne en python et dans d’autres langages. Renvoyer le même object que vous venez de mettre aide à couper quelques lignes de code.

Considérer:

 if (map.contains(value)){ obj = map.get(key); } else{ obj = new Object(); } 

contre:

 obj = map.putIfAbsent(key, new Object()); 

C’est dans le javadoc:

renvoie la valeur précédente associée à la clé spécifiée ou la valeur null s’il n’y avait pas de mappage pour la clé

Veuillez lire la documentation de ConcurrentHashMap.putIfAbsent :

Retours :
la valeur précédente associée à la clé spécifiée ou la valeur null s’il n’y avait pas de mappage pour la clé

Comme il n’y avait pas de valeur précédente pour la clé "key 3" , elle renvoie null .

Si vous regardez la documentation, il est écrit

Résultats:
la valeur précédente associée à la clé spécifiée ou la valeur null s’il n’y avait pas de mappage pour la clé

Dans votre cas, aucune valeur n’était précédemment associée à la clé, d’où NULL