hashmap的containskey("abc")通过equals()而非地址比较键,string因重写equals和hashcode而安全高效;null键合法且用==判断;类型不匹配则查不到。

当你在 HashMap 或 Hashtable 等 Map 类型集合上调用 containsKey("abc"),传入一个 String 参数,本质是在检查这个 Map 的**键集合(key set)中是否存在一个逻辑上等于该 String 的键对象**。
核心是“键的相等性判断,不是地址比较”
Map 不是靠内存地址来判断 key 是否存在,而是调用你传入的 key 对象的 equals() 方法,与 Map 内部已存 key 逐个比较。只要某个已有 key 满足:传入的 key.equals(已存的 key) == true,就返回 true。
所以传入 "abc" 能匹配到 map 中任意一个内容为 "abc" 的 String 键——哪怕它是另一个 new 出来的字符串实例。
String 作为 key 是安全且高效的
因为 String 类重写了 equals() 和 hashCode(),保证了:
• 内容相同的 String,hashCode() 值一定相同(满足哈希表定位前提)
• 内容相同的 String,equals() 一定返回 true(满足查找确认条件)
这意味着用 String 做 key 不仅语义清晰,而且不会出现“明明写了同一个词却查不到”的问题。
注意 null 键也是合法的
HashMap 允许 null 作为 key(Hashtable 不允许)。所以你可以写:map.containsKey(null)
只要 map 中确实通过 map.put(null, "value") 存过 null 键,这个调用就会返回 true。此时比较逻辑是:null 值直接按 == 判断,不调用 equals()。
类型必须匹配或能隐式转换
方法签名是 boolean containsKey(Object key),所以理论上可以传任何对象。但实际能否查到,取决于你当初 put 时用的是什么类型。
比如:map.put(123, "num"); → 用 Integer 当 keymap.containsKey("123") → 返回 false,因为 "123".equals(123) == false
字符串和数字即使内容相似,类型不同、equals 结果就是 false。











