Acredito que é, pelo menos em parte, permitir que você combine containsKeye faça getuma única ligação. Se o mapa puder conter nulos, não há como saber se getestá retornando um nulo porque não havia chave para esse valor ou apenas porque o valor era nulo.
Por que isso é um problema? Porque não há maneira segura de fazer isso sozinho. Pegue o seguinte código:
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
Como mé um mapa simultâneo, a chave k pode ser excluída entre as chamadas containsKeye get, fazendo com que esse trecho retorne um nulo que nunca estava na tabela, e não o desejado KeyNotPresentException.
Normalmente você resolveria isso sincronizando, mas com um mapa simultâneo que, obviamente, não funcionaria. Daí a assinatura paraget teve que mudar, e a única maneira de fazer isso de maneira compatível com versões anteriores era impedir o usuário inserir valores nulos em primeiro lugar e continuar usando-o como um espaço reservado para "chave não encontrada".