Java代码如何循环安全删除map呢?

欣喜 Java经验 发布时间:2025-04-22 09:22:50 阅读数:2998 1
下文笔者讲述java代码循环安全删除map中元素的方法及示例分享,如下所示

循环安全删除map的实现思路

方式1:
    Iterator 安全
	    直接操作原HashMap 代码稍显冗长 需要直接修改原 HashMap
方式2:
    removeIf
	 适合Java 8+需要Java 8
	   或
	 更高版本
	  需要直接修改原HashMap
方式3:
    记录键后删除
	 无需Iterator需要额外空间
	   效率较低 不推荐
方式4:
    函数式风格
	 生成新HashMap需要额外空间
	  生成新对象
	   需要保留原HashMap

使用Iterator删除

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);

        // 使用 Iterator 遍历并删除
        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Integer> entry = iterator.next();
            if (entry.getValue() == 2) { // 删除值为 2 的条目
                iterator.remove(); // 安全删除
            }
        }

        System.out.println(map); // 输出: {A=1, C=3}
    }
}

代码说明

    使用iterator.remove() 方法删除当前的数据
	  并不是直接操作HahsMap
    这种方法不会引发ConcurrentModificationException 报错

使用removeIf(Java 8+)

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);

        // 使用 removeIf 删除符合条件的条目
        map.entrySet().removeIf(entry -> entry.getValue() == 2);

        System.out.println(map); // 输出: {A=1, C=3}
    }
}

代码说明

    removeIf是Collection接口方法
	   HashMap的entrySet()返回一个集合
	     因此可以直接使用
    代码更简洁
	  适合Java 8及以上版本

遍历时记录需要删除的键(不推荐)

当你
不想使用Iterator 
     或
        removeIf
 可以先记录需要删除的键
   然后再统一删除
    这种方式不推荐,因为需要额外的空间。
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);

        // 记录需要删除的键
        Set<String> keysToRemove = new HashSet<>();
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 2) {
                keysToRemove.add(entry.getKey());
            }
        }

        // 统一删除
        for (String key : keysToRemove) {
            map.remove(key);
        }

        System.out.println(map); // 输出: {A=1, C=3}
    }
}

代码说明

    需要额外的集合(如 HashSet)来存储需要删除的键。
    不推荐,因为代码冗长且效率较低。

使用Stream(Java 8+)删除map对象

如果习惯使用函数式编程风格
 可使用Stream来过滤
   并生成新HashMap
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);

        // 使用 Stream 过滤并生成新的 HashMap
        Map<String, Integer> filteredMap = map.entrySet()
                .stream()
                .filter(entry -> entry.getValue() != 2)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

        System.out.println(filteredMap); // 输出: {A=1, C=3}
    }
}

代码说明

    使用 Stream过滤数据
	  并生成一个新HashMap
    适合需要保留原HashMap场景
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202504/17452858098435.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者