首先在處理之前需要明確一個事情,在當前場景下List或者普通數組中的元素如果是自定義對象那么就需要重寫對象的equals方法和hashCode方法。
對於List的處理
方法1,通過Set實現類包裹一層返回,缺點是會打亂原有集合的順序
public static <T> List<T> listRepeatUseSet(List<T> list){ HashSet<T> hashSet = new HashSet<>(list); return new ArrayList<>(hashSet); }
方法2,新建一個新的List集合,這里不能指定大小因為當前傳遞過來的集合是有重復的所以長度大小是不正確的。
public static <T> List<T> listRepeatUseIteration(List<T> list){ List<T> arrayList = new ArrayList<>(); ListIterator<T> listIterator = list.listIterator(); while (listIterator.hasNext()) { T next = listIterator.next(); if(!arrayList.contains(next)){ arrayList.add(next); } } return arrayList; }
方法3,在JDK8中可以通過流的方式使用collect收集方法收集成Set集合轉換成流收集成List集合
ArrayList<Integer> arrayList = new ArrayList<>(); Integer[] integers={1,2,5,4,5,7,8,9,5,4,7,1,2,3,8,5,7}; Collections.addAll(arrayList,integers); Set<Integer> collect = arrayList.stream().collect(Collectors.toSet()); ArrayList<Integer> collect1 = collect.stream().collect(Collectors.toCollection(ArrayList::new)); System.out.println(collect1);
其實第三種方式有點多余,操作好像兜了一圈那樣,並且IDEA中也提示可以使用集合Set具體集合類來初始化完成;但是如果面試時候或者別人問到,總要回答地出來吧。
對於數組的處理
如果是對象類型或者包裝類型可以使用下面方法,
Integer[] arr={78,52,41,36,25,63,52,45,85,62,25}; HashSet<Integer> hashSet = new HashSet<>(); Collections.addAll(hashSet,arr); //注意這里的size值需要使用hashSet的,不能使用原來的arr Integer[] integers = hashSet.toArray(new Integer[hashSet.size()]); System.out.println(Arrays.toString(integers));
JDK8之后還可以使用流的方式去重
Integer[] arr={78,52,41,36,25,63,52,45,85,62,25}; Integer[] integers = Arrays.stream(arr).distinct().toArray(Integer[]::new); System.out.println(Arrays.toString(integers));
但是如果是基本數據類型,那么只能使用循環遍歷判斷了或者是在JDK8中使用stream流,jdk8中提供int、double、long的基本數據類型的stream流
int[] arr={78,52,41,36,25,63,52,45,85,62,25}; int[] ints = Arrays.stream(arr).distinct().toArray(); System.out.println(Arrays.toString(ints));