Ich glaube , es ist zumindest teilweise zu erlauben , Sie zu kombinieren containsKey
und get
zu einem einzigen Anruf. Wenn die Map Nullen enthalten kann, kann nicht festgestellt werden, ob get
eine Null zurückgegeben wird, weil für diesen Wert kein Schlüssel vorhanden war oder nur weil der Wert null war.
Warum ist das ein Problem? Weil es keinen sicheren Weg gibt, das selbst zu tun. Nehmen Sie den folgenden Code:
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
Da m
es sich um eine gleichzeitige Zuordnung handelt, kann der Schlüssel k zwischen den Aufrufen containsKey
und gelöscht werden get
, wodurch dieses Snippet eine Null zurückgibt, die nie in der Tabelle enthalten war, und nicht die gewünschte KeyNotPresentException
.
Normalerweise würden Sie das durch Synchronisieren lösen, aber mit einer gleichzeitigen Karte funktioniert das natürlich nicht. Daher musste sich die Signatur für get
ändern, und die einzige Möglichkeit, dies abwärtskompatibel zu tun, bestand darin, zu verhindern, dass der Benutzer überhaupt Nullwerte einfügt, und diese weiterhin als Platzhalter für "Schlüssel nicht gefunden" zu verwenden.