Você deve verificar se o mapa contém Key antes de usar o putIfAbsent do ConcurrentMap

Eu tenho usado o ConcurrentMap do Java para um mapa que pode ser usado em vários segmentos. O putIfAbsent é um ótimo método e é muito mais fácil de ler / gravar do que usar operações de mapa padrão. Eu tenho algum código que se parece com isso:

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

// ...

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

Em termos de legibilidade, isso é ótimo, mas exige a criação de um novo HashSet sempre, mesmo que já esteja no mapa. Eu poderia escrever isso:

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

Com essa alteração, perde um pouco de legibilidade, mas não precisa criar o HashSet todas as vezes. Qual é o melhor neste caso? Eu costumo ficar do lado do primeiro, pois é mais legível. O segundo teria um desempenho melhor e pode ser mais correto. Talvez haja uma maneira melhor de fazer isso do que qualquer um deles.

Qual é a melhor prática para usar um putIfAbsent dessa maneira?

questionAnswers(6)

yourAnswerToTheQuestion