😊 @ 作者: 一恍过去
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: Java开发基础系列(十三):集合对象(Set接口)
⏱️ @ 创作时间: 2023年07月27日

Java开发基础系列(十三):集合对象(Set接口)-LMLPHP

Set 接口的实现类

  • HashSet: 基于哈希表实现的集合,不保证元素的顺序。
  • LinkedHashSet: 基于哈希表和双向链表实现的集合,保持元素插入顺序。
  • TreeSet: 基于红黑树实现的有序集合,按照元素的自然排序或指定的比较器排序。

HashSet

HashSet 是 Java 集合框架中 Set 接口的一个实现类,它基于哈希表数据结构实现,用于存储一组不重复的元素。HashSet 主要用于快速查找和去重,它不保证元素的顺序,即不按照插入的顺序进行存储。

HashSet 是 Java 中常用的集合类,适用于需要快速查找和去重的场景。由于其基于哈希表的实现,查找元素的效率非常高,但它不保证元素的顺序。如果需要保持插入顺序或对元素进行排序,考虑使用 LinkedHashSet 或 TreeSetHashSet 适用于需要快速查找和去重的无序集合场景。

优点:

  • 去重: HashSet 中不允许重复的元素,因此可以用于去除集合中重复的元素,确保集合中的元素是唯一的。
  • 快速查找: HashSet 基于哈希表实现,查找元素的时间复杂度是 O(1),这使得在大型数据集中快速查找某个元素成为可能。

基础用法:

  • 创建 HashSet 对象
    使用无参构造函数可以创建一个空的 HashSet 对象,并使用 add() 方法向集合中添加元素。

    HashSet<String> set = new HashSet<>();
    set.add("AA");
    set.add("BB");
    set.add("CC");
    
  • 遍历 HashSet
    HashSet 不支持通过索引访问元素,因为它是无序的,所以一般使用迭代器或增强型 for 循环遍历集合中的所有元素。

    for (String fruit : set) {
        System.out.println(fruit);
    }
    
  • 删除元素
    使用 remove() 方法可以从集合中删除指定的元素。

    set.remove("CC"); // 删除元素 "CC"
    
  • 获取元素个数
    使用 size() 方法可以获取集合中元素的个数。

    int size = set.size(); // 获取集合中元素的个数
    
  • 清空集合
    使用 clear() 方法可以清空集合中的所有元素。

    set.clear(); // 清空集合中的所有元素
    

LinkedHashSet

LinkedHashSet 是 Java 集合框架中 Set 接口的一个实现类,它是 HashSet 的一个子类。LinkedHashSet 同样用于存储一组不重复的元素,但与 HashSet 不同的是,它保持元素的插入顺序,即按照元素插入的顺序进行存储。LinkedHashSet 通过使用链表和哈希表结合的方式来实现这一特性。

由于其使用链表和哈希表结合的方式,既可以保持元素的插入顺序,又可以在 O(1) 的时间复杂度内进行元素的查找和去重操作。如果需要在集合中保持插入顺序并且不允许重复元素,LinkedHashSet 将是一个很好的选择。

优点:

  • 去重: LinkedHashSet 中不允许重复的元素,因此可以用于去除集合中重复的元素,确保集合中的元素是唯一的。
  • 保持插入顺序: LinkedHashSet 会保持元素的插入顺序,即按照元素插入的顺序进行存储,这使得在迭代时可以按照插入顺序访问元素。

基础用法:

  • 创建 LinkedHashSet 对象
    使用无参构造函数可以创建一个空的 LinkedHashSet 对象,并使用 add() 方法向集合中添加元素。

    LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
    linkedHashSet.add("AA");
    linkedHashSet.add("BB");
    linkedHashSet.add("CC");
    
  • 遍历 LinkedHashSet
    LinkedHashSet 会保持元素的插入顺序,因此可以使用迭代器或增强型 for 循环按照插入顺序遍历集合中的所有元素。

    for (String fruit : linkedHashSet) {
        System.out.println(fruit);
    }
    
  • 删除元素
    使用 remove() 方法可以从集合中删除指定的元素。

    linkedHashSet.remove("CC"); // 删除元素 "CC"
    
  • 获取元素个数
    使用 size() 方法可以获取集合中元素的个数。

    int size = linkedHashSet.size(); // 获取集合中元素的个数
    
  • 清空集合
    使用 clear() 方法可以清空集合中的所有元素。

    linkedHashSet.clear(); // 清空集合中的所有元素
    

TreeSet

TreeSet 是 Java 集合框架中 Set 接口的一个实现类,它使用红黑树来存储元素。TreeSet 中的元素是有序的,并且不允许重复元素。根据元素的自然顺序或指定的比较器,TreeSet 可以对元素进行自动排序。

TreeSet 是 Java 中常用的集合类,适用于需要排序、去重以及快速查找的场景。它适用于元素需要按照自然顺序或者自定义规则排序的情况。记住,使用 TreeSet 需要确保元素类实现了 Comparable 接口,或者通过比较器进行定制排序,以确保元素可以正确地排序存储。由于红黑树的结构,TreeSet 在查找元素时效率非常高。

优点:

  • 排序: TreeSet 会根据元素的自然顺序或指定的比较器对元素进行排序,因此它可以用于按照一定规则对元素进行排序存储。
  • 去重: TreeSet 中不允许重复的元素,因此可以用于去除集合中重复的元素,确保集合中的元素是唯一的。
  • 快速查找: 红黑树的结构使得查找元素的时间复杂度为 O(log n),在大型数据集中快速查找某个元素成为可能。

基础用法:

  • 创建 TreeSet 对象
    使用无参构造函数可以创建一个空的 TreeSet 对象,并使用 add() 方法向集合中添加元素。

    TreeSet<String> treeSet = new TreeSet<>();
    treeSet.add("AA");
    treeSet.add("BB");
    treeSet.add("CC");
    
  • 自然排序和定制排序
    TreeSet 可以使用元素的自然顺序(如果元素类实现了 Comparable 接口)或者通过自定义的比较器来进行排序。

    // 自然排序:元素类实现 Comparable 接口,并定义 compareTo 方法
    TreeSet<Integer> naturalTreeSet = new TreeSet<>();
    naturalTreeSet.add(5);
    naturalTreeSet.add(2);
    naturalTreeSet.add(8); // 结果:[2, 5, 8]
    
    // 定制排序:使用自定义的比较器 Comparator
    TreeSet<Integer> customTreeSet = new TreeSet<>((a, b) -> b - a); // 降序排序
    customTreeSet.add(5);
    customTreeSet.add(2);
    customTreeSet.add(8); // 结果:[8, 5, 2]
    
  • 遍历 TreeSet
    TreeSet 中的元素是有序的,可以使用迭代器或增强型 for 循环按顺序遍历集合中的所有元素。

    for (String fruit : treeSet) {
        System.out.println(fruit);
    }
    
  • 删除元素
    使用 remove() 方法可以从集合中删除指定的元素。

    treeSet.remove("CC"); // 删除元素 "CC"
    
  • 获取元素个数
    使用 size() 方法可以获取集合中元素的个数。

    int size = treeSet.size(); // 获取集合中元素的个数
    
  • 清空集合
    使用 clear() 方法可以清空集合中的所有元素。

    treeSet.clear(); // 清空集合中的所有元素
    

Java开发基础系列(十三):集合对象(Set接口)-LMLPHP

07-27 21:08