ConcurrentHashMap的keySet(V mappedValue)方法原理、用法及示例问询
keySet(V mappedValue) Method Great question! This method is a bit of a hidden gem in ConcurrentHashMap—it solves a specific problem that the regular keySet() can't handle, so let's break it down clearly.
How It Works
First, forget what you know about the standard keySet() method (the one without arguments). That regular key set is a read-only-for-adds view because you can't add a key without a corresponding value.
The keySet(V mappedValue) method returns a KeySetView<K,V>—a special, live view tied directly to your original ConcurrentHashMap. Here's the core behavior:
- When you add a key to this
KeySetView, it automatically inserts a key-value pair(newKey, mappedValue)into the original map. If the key already exists, it won't overwrite the existing value (it behaves exactly likemap.putIfAbsent(newKey, mappedValue)). - Any changes to the original map (like adding/removing key-value pairs) are immediately reflected in the
KeySetView, and vice versa. - Just like
ConcurrentHashMap, this view is fully thread-safe for concurrent access and modifications.
Use Cases
You'd reach for this method when:
- You need to manage a set of keys, but each new key should automatically map to a fixed default value in the underlying map.
- You want a concurrent-safe way to initialize multiple keys with the same value without writing repetitive
putcalls. - You prefer a set-like interface for interacting with your map's keys, but still need the ability to add new keys (with a predefined value) to the map.
Clear, Runnable Example
Let's walk through a practical example to see this in action:
import java.util.concurrent.ConcurrentHashMap; import java.util.List; public class KeySetViewDemo { public static void main(String[] args) { // Initialize our base ConcurrentHashMap ConcurrentHashMap<String, Boolean> userActiveStatus = new ConcurrentHashMap<>(); userActiveStatus.put("alice", true); userActiveStatus.put("bob", false); // Get a KeySetView with default value: false (new users start as inactive) ConcurrentHashMap.KeySetView<String, Boolean> activeUserKeys = userActiveStatus.keySet(false); // Check initial state System.out.println("Initial KeySetView: " + activeUserKeys); // [alice, bob] System.out.println("Initial Map: " + userActiveStatus); // {alice=true, bob=false} // Add a new user to the KeySetView boolean addedCharlie = activeUserKeys.add("charlie"); System.out.println("Added charlie? " + addedCharlie); // true System.out.println("Map after adding charlie: " + userActiveStatus); // {alice=true, bob=false, charlie=false} // Try adding an existing user (won't overwrite the value) boolean addedAliceAgain = activeUserKeys.add("alice"); System.out.println("Added alice again? " + addedAliceAgain); // false System.out.println("Map after re-adding alice: " + userActiveStatus); // alice's value is still true // Batch add multiple users activeUserKeys.addAll(List.of("diana", "eve")); System.out.println("Map after batch add: " + userActiveStatus); // diana=false, eve=false added // Remove a key from the view (syncs with the map) activeUserKeys.remove("bob"); System.out.println("Map after removing bob: " + userActiveStatus); // bob's entry is gone } }
Key Takeaways from the Example
- Adding keys to the
KeySetViewdirectly populates the original map with your default value. - Existing keys won't have their values overwritten when you call
add(). - All modifications (add, remove, addAll) sync immediately between the view and the map.
- The view is thread-safe, so you can safely use it in multi-threaded environments just like
ConcurrentHashMap.
Answering Your Specific Question
Yes! Exactly—when you add myNewKey to this keySet, the pair (myNewKey, mappedValue) is added to the original map (but only if myNewKey wasn't already present). That's the entire purpose of this method: it bridges the gap between a set of keys and the underlying map by providing a default value for new entries.
内容的提问来源于stack exchange,提问作者Code Complete

