Если вы проверяете, содержит ли карта ключ, прежде чем использовать putIfAbsent

Я использовал ConcurrentMap Java для карты, которую можно использовать из нескольких потоков. PutIfAbsent - отличный метод, его намного проще читать / писать, чем использовать стандартные операции карты. У меня есть код, который выглядит следующим образом:

ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>();

// ...

map.putIfAbsent(name, new HashSet<X>());
map.get(name).add(Y);

Удобочитаемость - это здорово, но для этого требуется каждый раз создавать новый HashSet, даже если он уже есть на карте. Я мог бы написать это:

if (!map.containsKey(name)) {
    map.putIfAbsent(name, new HashSet<X>());
}
map.get(name).add(Y);

С этим изменением он немного теряет читаемость, но не нужно каждый раз создавать HashSet. Что лучше в этом случае? Я склоняюсь к первому, поскольку он более читабелен. Второй будет работать лучше и может быть более правильным. Может быть, есть лучший способ сделать это, чем любой из этих.

Как лучше всего использовать putIfAbsent таким образом?

69
задан Raedwald 17 January 2016 в 20:50
поделиться