前言
Java有多种方式保存对象引用,如数组,但是数组具有固定尺寸,故提供了一些集合类(也称容器类)来解决这个问题。本文将介绍一下Set集合。
Java Set简介
Set是一种用来存储不重复元素的容器,它的特性:
- 集合中元素是不重复的
- 存取是无序的,存入顺序和取出顺序,但也可以实现有序(实现类:LinkedHashSet)
- 没有下标,不能使用for循环通过下标遍历
Set常用的实现类
-
HashSet
底层基于HashMap实现(有一个HashMap类型的变量),当调用HashSet的add方法时,实际上是调用成员变量hashMap的put方法key使用hashSet集合的元素,value值是同一个Object对象
map.put(e, PRESENT);HashMap底层通过hash值定位到数组具体位置,所以是存取查询是比较快的。HashSet是有序的? 不一定,HashSet基于HashMap,HashMap是根据key的hash值进行了排序,如果刚好输入的排序和hash值排序一样,就是有序的。下面我们来实验一下:
有序的情况:
public static void hashSetTestSort() { HashSet<String> hashSet = new HashSet<>(); hashSet.add("1"); hashSet.add("2"); hashSet.add("3"); hashSet.add("4"); hashSet.add("5"); hashSet.add("6"); System.out.println(hashSet); }输出结果:
[1, 2, 3, 4, 5]
无序的情况:
public static void hashSetTest() { HashSet<String> hashSet = new HashSet<>(); hashSet.add("2023-1"); hashSet.add("2023-3"); hashSet.add("2023-5"); hashSet.add("2023-2"); hashSet.add("2023-4"); System.out.println(hashSet); }输出结果:
[2023-4, 2023-5, 2023-2, 2023-3, 2023-1]
-
TreeSet
元素不重复,底层基于TreeMap实现 可以按照一定的规则对元素进行排序,默认按照自然排序进行排序,插入/删除时 会维护底层红黑树,所以插入/删除的时候比HashSet慢些
示例:
public static void treeSetTest() { TreeSet<String> treeSet = new TreeSet<>(); treeSet.add("a3"); treeSet.add("a5"); treeSet.add("a1"); treeSet.add("a2"); System.out.println(treeSet); }执行结果:
[a1, a2, a3, a5]
-
LinkedHashSet
元素唯一、有序(存入顺序和取出顺序),底层基于LinkedHashMap实现,LinkedHashMap是有序的,所以LinkedHashSet也是有序的
示例:
public static void linkedHashSetTest() { LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("a3"); linkedHashSet.add("a5"); linkedHashSet.add("a1"); linkedHashSet.add("a2"); System.out.println(linkedHashSet); }运行结果:
[a3, a5, a1, a2]