少なくとも部分的には、結合して単一の呼び出しにできるようにするためだと思いcontainsKeyますget。マップが null を保持できる場合、getその値のキーがなかったため、または値が null だったために が null を返すかどうかを判断する方法はありません。
なぜそれが問題なのですか?自分でそれを行う安全な方法がないからです。次のコードを使用します。
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
は並行マップであるため、との呼び出しmの間でキー k が削除される可能性があり、このスニペットは目的の ではなく、テーブルに存在しなかった null を返します。containsKeygetKeyNotPresentException
通常は、同期することで解決しますが、同時実行マップではもちろん機能しません。したがって、 の署名getを変更する必要があり、下位互換性のある方法でそれを行う唯一の方法は、ユーザーが最初に null 値を挿入するのを防ぎ、それを「キーが見つかりません」のプレースホルダーとして引き続き使用することでした。