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 valeurnull
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