java一维数组去重并保持顺序的核心是用linkedhashset记录首次出现元素,其插入有序特性确保顺序;基本类型需手动遍历+set判断再转数组;自定义对象须重写equals和hashcode,null只保留第一个,数组为null需判空。

Java 中一维数组去重并保持原有顺序,核心思路是:用一个集合(如 LinkedHashSet)记录已出现的元素,同时利用其插入有序特性来保留首次出现的顺序。
使用 LinkedHashSet 实现(推荐)
LinkedHashSet 是 HashSet 的子类,内部维护插入顺序,既能去重又能记住添加顺序。适合处理基本类型包装类(如 Integer、String)或自定义对象(需正确重写 equals 和 hashCode)。
- 将原数组转为
List(如Arrays.asList()),再构造LinkedHashSet - 再转回数组——注意:对于引用类型可直接转换;基本类型需额外处理(见下文)
示例(String[]):
String[] arr = {"a", "b", "a", "c", "b"};
LinkedHashSet<string> set = new LinkedHashSet(Arrays.asList(arr));
String[] uniqueArr = set.toArray(new String[0]); // 自动保持顺序
</string>
处理基本类型数组(如 int[])
基本类型数组不能直接用泛型集合操作,需手动遍历 + Set 判断,再收集到新数组中。
- 创建
LinkedHashSet<integer></integer>(或Set<integer></integer>)辅助去重 - 遍历原
int[],逐个检查是否已存在,未出现则加入集合并写入结果列表 - 最后将
List<integer></integer>转为int[](可用stream().mapToInt(i -> i).toArray())
示例(int[]):
int[] arr = {1, 2, 1, 3, 2};
Set<integer> seen = new LinkedHashSet();
List<integer> list = new ArrayList();
for (int x : arr) {
if (seen.add(x)) { // add() 返回 true 表示首次添加
list.add(x);
}
}
int[] uniqueArr = list.stream().mapToInt(Integer::intValue).toArray();
</integer></integer>
不依赖集合的纯数组方案(小数据量可选)
若限制使用集合类,可用双重循环 + 标记数组实现,但时间复杂度为 O(n²),仅适用于极小规模数据。
- 新建布尔数组标记某位置是否应保留(即是否为该元素首次出现)
- 外层遍历每个元素,内层检查它在前面是否已出现
- 统计保留数量后,再分配新数组并复制
该方式代码更长、易错,且无法避免重复扫描,一般不推荐。
注意事项与边界情况
去重逻辑依赖 equals 和 hashCode 的正确实现。对自定义对象:
- 务必重写
equals()和hashCode(),否则默认按引用比较,相同内容对象仍被视为不同 - 空值(
null)可被LinkedHashSet存储一次,若原数组含多个null,只会保留第一个 - 原数组为
null时需提前判空,避免NullPointerException
不复杂但容易忽略细节,关键是选对容器并理解其行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











