Java数组如何去除重复元素?

使用HashSetLinkedHashSet(保留顺序)自动去重:将数组转为集合再转回数组,Java 8+可用Stream API的distinct()方法:Arrays.stream(arr).distinct().toArray(),传统方法可遍历数组手动过滤重复元素。

方法1:使用HashSet(推荐)

原理:利用HashSet自动去重的特性,将数组元素存入集合后再转回数组。
优点:代码简洁,时间复杂度低(O(n))。
缺点:不保证原始顺序(若需保序用LinkedHashSet)。

Java数组如何去除重复元素?

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²)),仅适合小规模数据。

Java数组如何去除重复元素?

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) 内存敏感且允许改变顺序

  • 推荐首选HashSetStream API(效率高、代码简洁)。
  • 需保序:用LinkedHashSet或遍历对比法。
  • 内存敏感:选排序后去重。
    实际开发中,根据数据规模、顺序要求和Java版本灵活选择方法即可。

引用说明
本文代码示例基于Oracle官方Java文档中的集合框架和Stream API实现,方法设计遵循《Effective Java》中关于数据处理的建议,排序去重算法参考了经典的双指针技术。

Java数组如何去除重复元素?

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/46305.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年7月5日 04:05
下一篇 2025年6月12日 12:00

相关推荐

  • Java怎么快速添加启动界面

    在Java中制作启动界面可通过两种方式实现:一是使用Java 6+内置的SplashScreen类,通过JVM参数指定启动图自动显示;二是手动创建Swing/JFX无边框窗口,加载图片后定时关闭并跳转主界面。

    2025年6月19日
    300
  • Java对象如何高效循环遍历?

    在Java中,循环对象主要分两种情况:遍历集合类对象(如List/Set)使用for-each或迭代器;遍历对象属性则需反射获取Field数组后循环处理,注意直接循环自定义对象本身需转为可迭代结构。

    2025年6月11日
    000
  • Java如何前移字符串中的字符?

    在Java中实现字符前移,可通过字符串截取与拼接完成,例如使用substring()方法拆分字符串,将目标字符移至开头再与其他部分拼接,也可将字符串转为字符数组操作元素位置后重新构建字符串。

    2025年6月10日
    200
  • Java如何高效批量保存数据?

    Java中批量保存可通过JDBC批处理、JPA的saveAll()方法或MyBatis批量插入实现,核心是减少数据库交互次数:JDBC用addBatch()收集SQL后executeBatch()执行;JPA/Hibernate整合Hibernate批处理配置;MyBatis通过ExecutorType.BATCH模式优化,需注意事务控制及合理设置批处理大小以避免内存溢出。

    2025年6月6日
    200
  • Java次方如何实现

    在Java中计算次方主要使用Math.pow()方法,语法为Math.pow(底数, 指数),该方法返回double类型结果,例如计算2的3次方可写为Math.pow(2, 3),注意结果需强制转换整数类型。

    2025年6月6日
    000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN