Я использовал 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 таким образом?