用 set 实现数组过滤黑名单项的核心是将黑名单转为 set 后用 filter + has 判断,因 set.has 为 o(1) 而数组 includes 为 o(n),大幅提升大数据量性能;需注意类型、大小写和空格严格匹配。

用 Set 实现数组过滤黑名单项,核心是把黑名单转为 Set,再用 filter 配合 has 判断——比用 includes 更快,尤其数据量大时。
把黑名单转成 Set
Set 的 has 方法时间复杂度是 O(1),而数组的 includes 是 O(n)。如果黑名单项较多(比如上百个),这一步能明显提升性能。
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用 filter + has 过滤原数组
遍历目标数组,只保留不在黑名单中的元素:
- 确保数组元素类型和黑名单 Set 中的类型一致(都是字符串、都是数字等)
- 注意大小写和空格——Set 匹配是严格相等,
'ABC'和'abc'被视为不同项 - 如果需忽略大小写,可统一转小写后存入 Set,过滤时也统一转换
const cleaned = data.filter(item => !blacklist.has(item));
// → ['user-456', 'admin@site.com']
处理对象数组(按某个字段过滤)
若数组中是对象,比如要根据 id 或 email 字段过滤,依然用 Set,只是判断逻辑稍作调整:
{ id: 'u1', name: 'Alice' },
{ id: 'u2', name: 'Bob' },
{ id: 'u3', name: 'Charlie' }
];
const blockedIds = new Set(['u2', 'u3']);
const activeUsers = users.filter(user => !blockedIds.has(user.id));
去重 + 过滤(一并处理)
如果原始数组本身有重复,又想过滤黑名单,可先用 Set 去重,再转回数组过滤:
const raw = ['a', 'b', 'a', 'c', 'b'];const unique = [...new Set(raw)].filter(x => !blacklist.has(x));
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










