HashSet
或LinkedHashSet
(保留顺序)自动去重:将数组转为集合再转回数组,Java 8+可用Stream API的distinct()
方法:Arrays.stream(arr).distinct().toArray()
,传统方法可遍历数组手动过滤重复元素。方法1:使用HashSet(推荐)
原理:利用HashSet
自动去重的特性,将数组元素存入集合后再转回数组。
优点:代码简洁,时间复杂度低(O(n))。
缺点:不保证原始顺序(若需保序用LinkedHashSet
)。
import java.util.*; public class Main { public static void main(String[] args) { Integer[] array = {1, 2, 3, 2, 4, 3}; // 示例数组 Set<Integer> set = new HashSet<>(Arrays.asList(array)); Integer[] uniqueArray = set.toArray(new Integer[0]); System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4] } }
方法2:Java 8 Stream API
原理:通过Stream.distinct()
过滤重复元素。
优点:代码简洁,支持链式操作,适合处理对象数组。
缺点:需Java 8+环境。
import java.util.Arrays; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { int[] array = {1, 2, 3, 2, 4, 3}; // 基本类型数组 int[] uniqueArray = Arrays.stream(array).distinct().toArray(); System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4] } }
方法3:遍历对比(保序)
原理:使用ArrayList
动态存储非重复元素,通过遍历检查是否已存在。
优点:保留原始顺序,兼容低版本Java。
缺点:时间复杂度高(O(n²)),仅适合小规模数据。
import java.util.*; public class Main { public static void main(String[] args) { int[] array = {1, 2, 3, 2, 4, 3}; List<Integer> list = new ArrayList<>(); for (int num : array) { if (!list.contains(num)) { list.add(num); } } int[] uniqueArray = list.stream().mapToInt(i -> i).toArray(); System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4] } }
方法4:先排序后去重
原理:先排序数组,再遍历跳过重复项。
优点:空间复杂度低(O(1)),适合内存受限场景。
缺点:改变原始顺序,时间复杂度受排序影响(O(n log n))。
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] array = {1, 3, 2, 2, 4, 3}; Arrays.sort(array); // 排序后:[1, 2, 2, 3, 3, 4] int index = 0; for (int i = 0; i < array.length; i++) { if (i == 0 || array[i] != array[i - 1]) { array[index++] = array[i]; } } int[] uniqueArray = Arrays.copyOf(array, index); System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4] } }
方法对比与选型建议
方法 | 时间复杂度 | 空间复杂度 | 是否保序 | 适用场景 |
---|---|---|---|---|
HashSet | O(n) | O(n) | 否 | 快速去重,无需保序 |
Stream API | O(n) | O(n) | 是 | Java 8+项目,代码简洁 |
遍历对比 | O(n²) | O(n) | 是 | 小数据量且需兼容低版本Java |
先排序后去重 | O(n log n) | O(1) | 否 | 内存敏感且允许改变顺序 |
- 推荐首选:
HashSet
或Stream API
(效率高、代码简洁)。 - 需保序:用
LinkedHashSet
或遍历对比法。 - 内存敏感:选排序后去重。
实际开发中,根据数据规模、顺序要求和Java版本灵活选择方法即可。
引用说明:
本文代码示例基于Oracle官方Java文档中的集合框架和Stream API实现,方法设计遵循《Effective Java》中关于数据处理的建议,排序去重算法参考了经典的双指针技术。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/46305.html