Java基础篇-集合(Set)

223 阅读2分钟

前言

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]