HashMap HashTable ConcurrentMap のキー値を null にすることはできますか?

HashMap HashTable ConcurrentMap のキー値を null にすることはできますか?

まず結論から話しましょう

ハッシュマップのキーと値は両方とも null にすることができ、キーが繰り返されると、2 番目のキーの値で最初のキーの値が上書きされます。

HashTable のキーと値を null にすることはできません

ConcurrentMap はデータを格納するため、そのキーと値を null にすることはできません。

1.ハッシュマップ

//key为null value为null
HashMap<String,String> hashMap=new HashMap<>();
hashMap.put(null,null);
hashMap.put("zhangsan",null);
System.out.println(hashMap);

//多个key为null
HashMap<String,String> hashMap2=new HashMap<>();
hashMap2.put(null,"111");
hashMap2.put(null,null);
System.out.println(hashMap2);

画像-20230719112516082

結論: ハッシュマップのキーと値はどちらも null にすることができ、キーが繰り返されると、2 番目のキーの値が最初のキーの値を上書きします。

原理

putメソッド

画像-20230719112657254

画像-20230719112735531

メソッドを取得する

画像-20230719112905985

返されるのはnullですが、この時点ではnull値が見つからないのか、対応する値が存在するのかは不明です。
ここで問題が発生します: スレッド A が containsKey() を使用して判断を行うと、この要素が存在することがわかり、この要素を取得するために get() を呼び出すと、スレッド B が参加し、スレッド B が要素を削除します。このとき、スレッド A が取得した値は null であり、スレッド A はこの値を取得したと思いますが、実際にはこのときの null は見つからなかった null です。このように、スレッド間でセキュリティの問題が発生する可能性があります。

画像-20230719113108419マルチスレッド環境でデータを保存するために currentHashMap を使用するため、そのキーと値を null にすることはできません。

2.ハッシュテーブル

//key为null
Hashtable<String, String> table = new Hashtable<String, String>();
table.put(null,"111");
System.out.println(table);

//value为null
Hashtable<String, String> table2 = new Hashtable<String, String>();
table2.put("zhangsan",null);
System.out.println(table2);

キーがnullです

画像-20230719113857486

値がnullです

画像-20230719113942278

結論 ハッシュテーブルのキー値はいずれも null にできません

原理

画像-20230719114134543

3.コンカレントマップ

ConcurrentMap<String, String> concurrentMap = new ConcurrentHashMap<>();
//key为null
concurrentMap.put(null,"111");
System.out.println(concurrentMap);


ConcurrentMap<String, String> concurrentMap2 = new ConcurrentHashMap<>();
//key为null
concurrentMap2.put("zhangsan",null);
System.out.println(concurrentMap2);

キーがnullです

画像-20230719120108173

値がnullです

画像-20230719120153336

原理

画像-20230719120249144

おすすめ

転載: blog.csdn.net/itScholar001/article/details/131805797