
方案1双层循环遍历去重不依赖其他集合纯ArrayList思路创建新的 ArrayList 存放结果遍历原集合每一个元素新集合中不存在该元素才添加自动去重importjava.util.ArrayList;publicclassArrayListDistinct1{publicstaticvoidmain(String[]args){// 原数组包含重复数据ArrayListIntegerlistnewArrayList();list.add(1);list.add(2);list.add(2);list.add(3);list.add(1);list.add(4);list.add(3);System.out.println(去重前list);ArrayListIntegernewListdistinctByLoop(list);System.out.println(去重后newList);}/** * 双层循环去重保留原有顺序 */publicstaticEArrayListEdistinctByLoop(ArrayListEoldList){ArrayListEresultnewArrayList();for(Eitem:oldList){// 新集合没有当前元素才添加if(!result.contains(item)){result.add(item);}}returnresult;}}输出去重前[1, 2, 2, 3, 1, 4, 3] 去重后[1, 2, 3, 4]优点仅使用 ArrayList不引入其他类保留插入顺序缺点contains()底层遍历数据量大性能差 O(n²)方案2借助 HashSet 快速去重性能更高推荐思路Set 天然不允许重复元素中转去重后转回 ArrayListimportjava.util.ArrayList;importjava.util.HashSet;importjava.util.Set;publicclassArrayListDistinct2{publicstaticvoidmain(String[]args){ArrayListStringlistnewArrayList();list.add(苹果);list.add(香蕉);list.add(苹果);list.add(橙子);list.add(香蕉);System.out.println(去重前list);ArrayListStringdistinctListdistinctBySet(list);System.out.println(去重后distinctList);}publicstaticEArrayListEdistinctBySet(ArrayListEoldList){// Set自动去重SetEsetnewHashSet(oldList);// 转回ArrayListreturnnewArrayList(set);}}注意HashSet 会打乱原有元素顺序。如果需要【去重保留顺序】用 LinkedHashSetimportjava.util.ArrayList;importjava.util.LinkedHashSet;importjava.util.Set;publicclassDistinctOrder{publicstaticEArrayListEdistinctKeepOrder(ArrayListEoldList){SetEsetnewLinkedHashSet(oldList);returnnewArrayList(set);}publicstaticvoidmain(String[]args){ArrayListIntegerlistnewArrayList();list.add(5);list.add(3);list.add(5);list.add(1);ArrayListIntegerresdistinctKeepOrder(list);System.out.println(res);// [5, 3, 1] 顺序不变}}方案3Java8 Stream一行代码去重最简写法importjava.util.ArrayList;importjava.util.List;publicclassStreamDistinct{publicstaticvoidmain(String[]args){ArrayListIntegerlistnewArrayList();list.add(2);list.add(2);list.add(7);list.add(7);list.add(9);// distinct() 去重collect转回ArrayListListIntegerdistinctListlist.stream().distinct().toList();System.out.println(distinctList);}}总结对比方式优点缺点双层循环contains只使用ArrayList、有序大数据效率低LinkedHashSet效率高、有序需要导入Set集合Stream distinct代码极简JDK8支持