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);
結論: ハッシュマップのキーと値はどちらも null にすることができ、キーが繰り返されると、2 番目のキーの値が最初のキーの値を上書きします。
原理
putメソッド
メソッドを取得する
返されるのはnullですが、この時点ではnull値が見つからないのか、対応する値が存在するのかは不明です。
ここで問題が発生します: スレッド A が containsKey() を使用して判断を行うと、この要素が存在することがわかり、この要素を取得するために get() を呼び出すと、スレッド B が参加し、スレッド B が要素を削除します。このとき、スレッド A が取得した値は null であり、スレッド A はこの値を取得したと思いますが、実際にはこのときの null は見つからなかった null です。このように、スレッド間でセキュリティの問題が発生する可能性があります。
マルチスレッド環境でデータを保存するために 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です
値がnullです
結論 ハッシュテーブルのキー値はいずれも null にできません
原理
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です
値がnullです
原理