粗心大意害死人之map.containsKey 与map.contains

本文详细介绍了在Java开发中如何正确区分并使用Map的containsKey和containsValue方法来判断键值是否存在,避免常见的错误用法。
最近经常用map,有次需要判断map中是不是有某个key,写代码的时候也没注意,就直接用了 map.contains ,结果运行结果一直不对。调试了很久,才终于在无意中发现,原来应该用map.containsKey 来做


`Map.containsKey()` 是 Java 中 `Map` 接口提供的一个方法,它的作用是: > ✅ **判断当前 Map 是否包含指定的键(key)** --- ### 🔍 方法签名 ```java boolean containsKey(Object key) ``` - **参数**:你要查询的 `key` - **返回值**: - `true`:如果 Map 中存在这个 `key` - `false`:如果不存在 --- ### 🧩 举个例子 ```java Map<String, Integer> map = new HashMap<>(); map.put("apple", 10); map.put("banana", 20); System.out.println(map.containsKey("apple")); // 输出 true System.out.println(map.containsKey("orange")); // 输出 false ``` --- ### 💡 常见用途 #### 1. 避免 `NullPointerException` 在获取值之前先检查 key 是否存在: ```java if (map.containsKey("apple")) { int count = map.get("apple"); System.out.println("数量:" + count); } ``` #### 2. 控制逻辑流程:比如“首次出现就处理” 就像你在代码中看到的: ```java if (!bigcOrder.contains(bigc)) { bigcOrder.add(bigc); // 第一次遇到这个业务大类,才加入顺序列表 } ``` 这其实就是在模拟 `containsKey` 的思想 —— 判断是否已记录过某个 `bigc`。 不过注意:`bigcOrder` 是 `List`,用的是 `list.contains()`,效率比 `Set` 或 `Map.containsKey()` 慢。 ✅ 更优写法建议: ```java Set<String> seenBigcs = new HashSet<>(); List<String> bigcOrder = new ArrayList<>(); for (DebtBusinessDayReportWholeAssetVO vo : wholeVO) { String bigc = getOrEmpty(vo.getBusiBigcName()); if (!seenBigcs.contains(bigc)) { // 等价于 map.containsKey seenBigcs.add(bigc); bigcOrder.add(bigc); } } ``` 或者更简洁地使用 `Set.add()` 的返回值(它本身就表示“是否是新增”): ```java Set<String> seen = new LinkedHashSet<>(); for (DebtBusinessDayReportWholeAssetVO vo : wholeVO) { String bigc = getOrEmpty(vo.getBusiBigcName()); if (seen.add(bigc)) { // add 返回 true 表示之前没加过 bigcOrder.add(bigc); } } ``` --- ### ⚠️ 注意事项 | 场景 | 说明 | |------|------| | `null` 作为 key | `map.containsKey(null)` 是合法的,取决于你是否允许 null 键 | | 性能 | `HashMap.containsKey()` 平均时间复杂度 O(1),非常快 | | `List.contains()` vs `Map.containsKey()` | 前者是 O(n),后者是 O(1),大数据量时差异明显 | --- ### ✅ 小结 > `map.containsKey(key)` 的作用就是: > > 👉 **快速判断某个键是否已经在 map 里了,常用于去重、条件判断、防止覆盖等场景** 它是开发中最常用的 Map 方法之一。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值