Java中Map的key不能重复,所有标准实现均强制key唯一性;重复put会覆盖value而非新增;判定依据是equals()和hashCode()方法;自定义key须重写二者;替代方案包括Map或第三方Multimap。
Java中Map的key不能重复。
Map接口的核心语义是“键值对映射”,每个key对应一个value。如果允许key重复,就无法通过key准确查找到唯一的value,这会破坏Map的基本功能。因此,所有标准Map实现(如HashMap、TreeMap、LinkedHashMap)都强制要求key的唯一性。
当你用相同的key调用put()方法时,新value会覆盖旧value,原key不会新增,也不会报错:
Mapmap = new HashMap<>(); map.put("age", 25); map.put("age", 30); // 不会添加新条目,而是替换value System.out.println(map.get("age")); // 输出:30
Map判断key是否重复,不是看引用是否相同,而是调用key对象的hashCode()和equals()方法:
所以,自定义类作key时,必须正确重写hashCode()和equals(),否则可能出
现逻辑错误(比如两个内容相同的对象被当作不同key)。
Map本身不支持重复key,但有几种常见替代方案:
Map> 或Map> :一个key对应多个value;Multimap或Apache Commons Collections的MultiValueMap;部分Map实现允许一个null作为key(如HashMap、LinkedHashMap),但只能有一个。再次put(null, value)仍为覆盖操作。TreeMap则不允许null key(会抛NullPointerException),因为其排序机制依赖key的比较逻辑。