Saya percaya itu adalah, setidaknya sebagian, untuk memungkinkan Anda menggabungkan containsKey
dan get
menjadi satu panggilan. Jika peta dapat menyimpan nol, tidak ada cara untuk mengetahui apakah get
mengembalikan nol karena tidak ada kunci untuk nilai itu, atau hanya karena nilainya nol.
Mengapa itu menjadi masalah? Karena tidak ada cara aman untuk melakukannya sendiri. Ambil kode berikut:
if (m.containsKey(k)) {
return m.get(k);
} else {
throw new KeyNotPresentException();
}
Karena m
ini adalah peta konkuren, kunci k dapat dihapus di antaracontainsKey
dan get
panggilan, menyebabkan potongan ini mengembalikan nol yang tidak pernah ada dalam tabel, daripada yang diinginkan KeyNotPresentException
.
Biasanya Anda akan menyelesaikannya dengan menyinkronkan, tetapi dengan peta bersamaan yang tentu saja tidak akan berfungsi. Karenanya tanda tangan untuk get
harus berubah, dan satu-satunya cara untuk melakukan itu dengan cara yang kompatibel-mundur adalah mencegah pengguna memasukkan nilai nol di tempat pertama, dan terus menggunakannya sebagai pengganti untuk "kunci tidak ditemukan".