Java中如何移除HashMap内指向同一元素的所有键值对
问题解答
关于Map中存储对象实例数量的说明
每次执行put("nasa", a1)这类操作时,不会创建新的a1实例。
Java中向HashMap存入对象类型的值时,存的是对象的引用(内存地址),不是对象本身的完整拷贝。你给"nasa"、"space"、"mars"三个键都绑定a1的场景下,堆内存中始终只有1个a1实例,Map的三个条目里存的都是指向这同一个实例的引用,不存在3个a1对象。
你可以做个简单验证:通过任意一个键取出对象修改它的属性,再通过另外两个键取出对象读取属性,会发现修改是同步生效的,就能证明三个键指向的是同一个实例。
删除目标实例及所有关联键的实现方案
你当前使用的Map<String, Artigo>结构只维护了键到值的正向映射,没有值到关联键的反向索引,要移除所有指向a1的键,可以按以下步骤实现:
- 遍历Map的所有条目,收集所有值为目标a1实例的键,注意不要在遍历过程中直接执行删除操作,会触发并发修改异常
- 遍历收集到的待删除键列表,批量从Map中移除对应条目
参考实现代码:
// 定义要删除的目标Artigo实例 Artigo deleteTarget = a1; List<String> matchKeys = new ArrayList<>(); // 第一步:收集所有指向目标实例的键 for (Map.Entry<String, Artigo> entry : listaArtigos.entrySet()) { // 要匹配同一个内存实例用==判断,要按对象值相等匹配则替换为equals方法 if (entry.getValue() == deleteTarget) { matchKeys.add(entry.getKey()); } } // 第二步:批量移除所有关联键 for (String key : matchKeys) { listaArtigos.remove(key); }
如果这类按值删除所有关联键的操作在你的业务中出现频率很高,可以额外维护一个反向映射结构Map<Artigo, Set<String>>,每次执行put操作时同步更新反向映射中对应值的键集合,后续删除时可以直接通过反向映射拿到所有关联键,不需要每次全量遍历Map,执行效率更高。
内容的提问来源于stack exchange,提问作者bogan
相关产品推荐
相关产品推荐

