2014-02-07 6 views
12

Следующая программа печатает NULL. Я не могу понять, почему.ConcurrentHashMap putIfAbsent() возвращается null

public class ConcurrentHashMapTest { 
    public static final ConcurrentMap<String, String> 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 String get(final String key) { 
     return map.putIfAbsent(key, "value 3"); 
    } 
} 

Может ли кто-нибудь помочь мне понять поведение?

+0

Какое поведение вы ожидали * и почему? –

ответ

15

ConcurrentMap.putIfAbscent возвращает предыдущее значение, связанное с указанным ключом, или null, если для ключа не было сопоставления. У вас не было значения, связанного с «ключом 3». Все правильно

6

putIfAbsent() возвращает предыдущее значение, связанное с указанным ключом, или null, если не было никакого отображения для ключа, а потому key 3 нет на карте, так что возвращает null.

Вы добавили key 1 и key 2 на карту, но key 3 не имеет каких-либо значений. Итак, вы получаете null. Карта key 3 с некоторым значением и putIfAbsent() вернет предыдущее значение, связанное с этим ключом.

Как если карта уже содержит key 3, связанный со значением A

key 3 ---> A 

Тогда при вызове map.putIfAbsent("key 3","B") вернется A

3

Пожалуйста, прочитайте документацию ConcurrentHashMap.putIfAbsent:

возвращений:
предыдущее значение, связанное с указанным ключом, или null, если не было никакого отображения для ключа

Как не было никакого предыдущего значения для ключа "key 3", он возвращает null.

3

Это в Javadoc:

возвращает предыдущее значение, связанное с указанным ключом, или нулевое значение, если не было никакого отображения для ключа

+0

Для кавычек вы должны использовать '>', а не форматирование кода. –

+0

Да, я забыл ... :) не ответил ни на минуту – Bozho

2

Если вы посмотрите на документацию, она говорит

Возвращает:
предыдущее значение, связанное с указанным ключом, или нуль, если не было никакого отображения для ключа

В вашем случае никакого значения не ранее, связанное с ключом, следовательно, NULL

5

Это часто задаваемый вопрос, который, возможно, предложить такое поведение неинтуитивными. Возможно, путаница возникает из-за того, как dict.setdefault() работает на python и на других языках. Возвращая тот же объект, который вы только что положили, помогает вырезать несколько строк кода.

Рассмотрим:

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

против:

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

Проблема заключается в том, что по определению putIfAbsent вернуть старое значение, а не новое значение (старое значение отсутствует всегда нуль). Используйте computeIfAbsent - это вернет вам новое значение.

private static String get(final String key) { 
    return map.computeIfAbsent(key, s -> "value 3"); 
} 
Смежные вопросы