Java中Map的key不能重复,所有标准实现均强制key唯一性;重复put会覆盖value而非新增;判定依据是equals()和hashCode()方法;自定义key须重写二者;替代方案包括Map或第三方Multimap。

Java中Map的key不能重复。
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
重复key的判定依据:equals() + hashCode()
Map判断key是否重复,不是看引用是否相同,而是调用key对象的hashCode()和equals()方法:
立即学习“Java免费学习笔记(深入)”;
- 先比较hashCode:若不同,直接视为不同key;
- 若hashCode相同,再调用equals():返回true则认为是同一key,触发覆盖。
所以,自定义类作key时,必须正确重写hashCode()和equals(),否则可能出现逻辑错误(比如两个内容相同的对象被当作不同key)。
想存多个相同key怎么办?
Map本身不支持重复key,但有几种常见替代方案:
- 使用
Map或> Map:一个key对应多个value;> - 选用第三方库类型,如Guava的
Multimap或Apache Commons Collections的MultiValueMap; - 改用List
>等结构,放弃Map的查找优势,换得灵活性。
注意:null key的特殊性
部分Map实现允许一个null作为key(如HashMap、LinkedHashMap),但只能有一个。再次put(null, value)仍为覆盖操作。TreeMap则不允许null key(会抛NullPointerException),因为其排序机制依赖key的比较逻辑。










