面向对象多态本身不能直接剔除数组重复元素,但可封装“重复判定规则”为接口EqualityStrategy<T>,通过不同实现支持数值、忽略大小写的字符串或自定义对象去重,并结合Arrays工具类(如排序、转换)与集合协同完成任务。

用面向对象多态配合 Arrays 工具类本身无法直接剔除数组重复元素——因为 Arrays 类不提供去重方法,且多态解决的是行为抽象问题,而非数据结构操作。但可以借助多态设计灵活的去重策略,并结合 Arrays(如排序、转换)与集合工具协同完成任务。关键在于:把“如何判断重复”这一逻辑交给多态实现,把“数组转集合、去重、再转回数组”这一流程标准化。
用多态封装“重复判定规则”
不同业务中,“重复”的定义可能不同:整数看数值,字符串看忽略大小写,自定义对象可能按 ID 或多个字段组合判断。这时可定义统一接口:
interface EqualityStrategy<T> {
boolean equals(T a, T b);
}
然后为不同场景提供实现:
-
数值型策略:直接用
Objects.equals(a, b) -
忽略大小写字符串策略:调用
String.equalsIgnoreCase() -
用户对象策略:按
id字段比较,或使用Objects.equals(user1.getId(), user2.getId())
借助 Arrays 排序 + 手动遍历去重(适用于已排序或可排序数组)
若数组元素可自然排序(或通过 Comparator 排序),可先用 Arrays.sort(),再单次遍历跳过相邻重复项。此时多态体现在传入的 Comparator ——它本身就是函数式接口,天然支持多态扩展:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 对
String[]:用String.CASE_INSENSITIVE_ORDER - 对
User[]:传入Comparator.comparing(User::getId) - 排序后遍历填充新数组,只保留首个出现的元素即可
通用方案:数组 → List → Stream/LinkedHashSet → 数组
这是最常用且兼顾顺序与扩展性的做法,多态用于构造去重依据:
- 将原数组转为
List(用Arrays.asList()) - 创建
LinkedHashSet并重写其add行为?不行——但可通过Stream.distinct()配合自定义equals/hashCode,或更推荐:提前将元素映射为唯一键 - 例如:用
stream().map(e -> strategy.keyOf(e)).distinct()提取特征键去重,再关联还原原对象 - 最后用
toArray()转回数组(需指定类型,如toArray(new String[0]))
一个简洁可复用的工具方法示例
封装成静态泛型方法,接收数组和策略对象,内部用 LinkedHashSet 保序去重:
public static <T> T[] deduplicate(T[] array, EqualityStrategy<T> strategy) {
if (array == null || array.length == 0) return array;
List<T> list = new ArrayList<>();
for (T item : array) {
boolean isDuplicate = list.stream()
.anyMatch(existing -> strategy.equals(existing, item));
if (!isDuplicate) list.add(item);
}
@SuppressWarnings("unchecked")
T[] result = (T[]) new Object[list.size()];
return list.toArray(result);
}
调用时只需传入对应策略实例,无需修改核心逻辑——这正是多态带来的可维护性提升。

















