一、Set 和数组的概念
在 Java 中,Set 是一种不允许重复元素的 Collection 集合。和 List 不同,Set 不保证元素的顺序。而数组是一种特殊的数据结构,它可以容纳固定数量的元素,这些元素可以是不同的数据类型。
二、为什么需要将数组转成 Set
将数组转成 Set 可以非常方便地去掉数组中的重复元素,因为 Set 只保留不同的元素,将数组转成 Set 可以去重。此外,很多情况下需要将数组中的元素添加到 Collection 集合中,此时需要先将数组转成 Set,然后再将 Set 中的所有元素添加到 Collection 集合中。
三、使用 Java 自带类库将数组转成 Set
Java 提供了 HashSet 和 TreeSet 两个类来实现 Set 集合。我们可以调用这两个类的构造函数,将数组作为参数传入。
1. 使用 HashSet
public static <T> Set<T> arrayToSet(T[] arr) { return new HashSet<>(Arrays.asList(arr)); }
以上方法的具体实现是将数组传入 Arrays.asList() 方法,该方法会返回一个 List<T> 对象,然后再将该 List 对象作为参数传入 HashSet 的构造函数中,创建一个 HashSet 对象。
2. 使用 TreeSet
public static <T> Set<T> arrayToSet(T[] arr) { Set<T> set = new TreeSet<>(); Collections.addAll(set, arr); return set; }
以上方法的具体实现是先创建一个空的 TreeSet 对象,然后通过 Collections.addAll() 方法将数组中的元素添加到 TreeSet 中,添加时会自动去重。注意:使用 TreeSet 时需保证数组中所有元素的类型都实现了 Comparable 接口,否则会抛出 ClassCastException 异常。
四、自定义方式将数组转成 Set
除了使用 Java 自带类库外,我们也可以自定义方式将数组转成 Set,这里提供两种实现方式。
1. 使用 LinkedHashSet
public static <T> Set<T> arrayToSet(T[] arr) { Set<T> set = new LinkedHashSet<>(); for (T element : arr) { set.add(element); } return set; }
以上方法使用 LinkedHashSet 实现,它是 HashSet 的一个子类,并且它可以保证元素的插入顺序和维护顺序一致。
2. 使用 Stream API
public static <T> Set<T> arrayToSet(T[] arr) { return Arrays.stream(arr) .collect(Collectors.toSet()); }
以上方法使用 Java 8 中的 Stream API 实现,它可以将数组转成 Stream 流,在使用 Collectors.toSet() 方法将流中的所有元素转成 Set。