Я использую Java ConcurrentMap для карты, которая может использоваться из нескольких потоков. 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 таким образом?