Java Set基础篇

news/2024/5/17 5:39:40 标签: java, 开发语言

目录

  • 前言
  • 一、常用Set
    • 1.1 Set
      • 1.1.1 特点
    • 1.2 HashSet
      • 1.2.1 特点
      • 1.2.2 使用
    • 1.3 TreeSet
      • 1.3.1 特点
      • 1.3.2 使用
    • 1.4 LinkedHashSet
      • 1.4.1 特点
      • 1.4.2 使用
  • 二、对比总结


目录

前言

一、常用Set

1.1 Set

Set是一个继承自Collection的接口:

java">public interface Set<E> extends Collection<E> {

Set接口包含Collection接口的所有方法。

api作用描述
add()将指定的元素添加到集合中
addAll()将指定集合的所有元素添加到集合中
iterator()返回一个迭代器,该迭代器可用于顺序访问集合中的元素
remove()从集合中移除指定的元素
removeAll()从存在于另一个指定集合中的集合中删除所有元素
keepAll()保留集合中所有还存在于另一个指定集合中的所有元素
clear()从集合中删除所有元素
size()返回集合的长度(元素数)
toArray()返回包含集合中所有元素的数组
contains()如果集合包含指定的元素,则返回true
containsAll()如果集合包含指定集合的所有元素,则返回true
hashCode()返回哈希码值(集合中元素的地址)

Set集合的实现类主要为HashSet、TreeSet、LinkedHashSet等。

1.1.1 特点

Set集合的特点是:

不允许重复元素。
不保证元素的顺序,取决于具体实现类。
基于哈希表或红黑树等数据结构实现。

1.2 HashSet

HashSet是基于哈希表实现的Set集合,不允许重复元素。它通过哈希算法将元素存储在内部的哈希表中,提供了快速的查找和插入操作。

java">public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable

1.2.1 特点

HashSet的特点

不允许重复元素。
不保证元素的顺序,取决于哈希算法和具体实现。
具有常数时间复杂度(O(1))的查找、插入和删除操作。
适用于需要快速查找元素且不关心顺序的场景。
内部使用HashMap实现,元素存储在键的位置,值为一个静态的Object对象。

1.2.2 使用

java">    public static void main(String[] args) {
        //使用HashSet类创建集合
        Set<Integer> set1 = new HashSet<>();

        //将元素添加到set1
        set1.add(2);
        set1.add(3);
        System.out.println("Set1: " + set1);

        //使用HashSet类创建另一个集合
        Set<Integer> set2 = new HashSet<>();

        //添加元素
        set2.add(1);
        set2.add(2);
        System.out.println("Set2: " + set2);

        //两个集合的并集
        set2.addAll(set1);
        System.out.println("并集是: " + set2);
    }

输出:
在这里插入图片描述

1.3 TreeSet

TreeSet是基于红黑树实现的Set集合,可以按照元素的自然顺序或自定义顺序进行排序。它提供了有序的遍历能力,支持高效的插入、删除和查找操作。

java">public class TreeSet<E> extends AbstractSet<E>
    implements NavigableSet<E>, Cloneable, java.io.Serializable

1.3.1 特点

TreeSet的特点:

元素按照自然顺序或自定义顺序排序。
提供有序的遍历能力。
查找、插入和删除操作的时间复杂度为O(log n)。
适用于需要有序访问元素的场景。

1.3.2 使用

java">    public static void main(String[] args) {
        //使用TreeSet类创建集合
        Set<Integer> numbers = new TreeSet<>();

        // 将元素添加到set集合
        numbers.add(2);
        numbers.add(3);
        numbers.add(1);
        System.out.println("TreeSet: " + numbers);

        //使用iterator()访问元素
        System.out.print("使用iterator()访问元素: ");
        Iterator<Integer> iterate = numbers.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }

输出:可以看到TreeSet对元素进行了排序
在这里插入图片描述

1.4 LinkedHashSet

LinkedHashSet是HashSet的子类,它在HashSet的基础上通过双向链表维护了元素的插入顺序,因此可以保持元素的插入顺序。在需要保持元素插入顺序的场景,同时又需要HashSet的快速查找特性的情况下,使用LinkedHashSet是一个不错的选择。

java">public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

1.4.1 特点

LinkedHashSet的特点:

保持插入顺序或访问顺序。
继承了HashSet的查找效率。
具有HashSet的不允许重复元素的特性。
适用于需要保持元素插入顺序的场景。

1.4.2 使用

java">//具有8个容量和0.75负载因子的LinkedHashSet
LinkedHashSet<Integer> numbers = new LinkedHashSet<>(8, 0.75);

capacity - 该哈希集的容量为8。意味着,它可以存储8个元素。
此哈希集的负载因子为0.75。这意味着,只要我们的哈希表填充了75%,元素就会移动到新哈希表中,该哈希表的大小是原始哈希表的两倍。

并集demo

java">    public static void test1() {
        LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("LinkedHashSet1: " + evenNumbers);

        LinkedHashSet<Integer> numbers = new LinkedHashSet<>();
        numbers.add(1);
        numbers.add(3);
        System.out.println("LinkedHashSet2: " + numbers);

        //两个集合的并集
        numbers.addAll(evenNumbers);
        System.out.println("并集: " + numbers);
    }

输出:
在这里插入图片描述
交集demo

java"> public static void test2() {
        LinkedHashSet<Integer> primeNumbers = new LinkedHashSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        System.out.println("LinkedHashSet1: " + primeNumbers);

        LinkedHashSet<Integer> evenNumbers = new LinkedHashSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("LinkedHashSet2: " + evenNumbers);

        //集合的交集
        evenNumbers.retainAll(primeNumbers);
        System.out.println("集合的交集: " + evenNumbers);
    }

输出
在这里插入图片描述

LinkedHashSet常用API:

api作用描述
boolean add(E e)向集合中添加指定元素。
void addAll(Collection<? extends E> c)将指定集合中的所有元素添加到集合中。
boolean remove(Object o)从集合中删除指定元素。
void clear()清空集合中的所有元素。
boolean contains(Object o)判断集合中是否包含指定元素。
boolean isEmpty()判断集合是否为空。
int size()返回集合中元素的个数。
Iterator iterator()返回一个迭代器,用于遍历集合中的元素。
forEach(Consumer<? super E> action)对集合中的每个元素执行指定操作。
void clear()清空集合中的所有元素。
Object clone()复制集合。
boolean retainAll(Collection<?> c)仅保留集合中包含在指定集合中的元素。

LinkedHashSet与HashSet的区别

LinkedHashSet在内部维护一个链表。因此,它保持其元素的插入顺序。
LinkedHashSet类比HashSet需要更多的存储空间。这是因为LinkedHashSet在内部维护链表。
LinkedHashSet的性能比HashSet慢。这是因为LinkedHashSet中存在链表。

LinkedHashSet 与TreeSet的区别

TreeSet类实现了SortedSet接口。这就是为什么树集中的元素是有序的。但是,LinkedHashSet类只维护其元素的插入顺序。
TreeSet通常比LinkedHashSet慢。这是因为每当将元素添加到TreeSet时,它都必须执行排序操作。
LinkedHashSet允许插入空值。但是不能向TreeSet插入空值。

二、对比总结

Set特点适用场景
HashSet基于哈希表实现,不保证元素的顺序。适用于需要快速查找元素且不关心顺序的场景。
TreeSet基于红黑树实现,元素按照自然顺序或自定义顺序排序。适用于需要有序访问元素的场景,提供了有序的遍历能力。
LinkedHashSet基于哈希表和双向链表实现,保持插入顺序或访问顺序。适用于需要保持插入顺序或访问顺序的场景,提供了可以预测的迭代顺序。

参考链接:
Java LinkedHashSet
Java Set 接口


http://www.niftyadmin.cn/n/5481584.html

相关文章

JavaScript数组操作方法全录

改变原数组的方法&#xff1a; push() - 将一个或多个元素添加到数组的末尾&#xff0c;并返回新数组的长度。 pop() - 从数组中移除最后一个元素&#xff0c;并返回该元素。 shift() - 从数组中移除第一个元素&#xff0c;并返回该元素。 unshift() - 将一个或多个元素添加到…

GD32F470_GY30光照传感器模块 数字光强度BH1750FVI光照度

2.29 BH1750光照强度检测传感器 采用ROHM原装BH1750FVI芯片供电电源:3-5V&#xff0c;光照度范围:0-65535lx传感器内置16bitAD转换器&#xff0c;直接数字输出&#xff0c;省略复杂的计算&#xff0c;省略标定&#xff0c;不区分环境光源接近于视觉灵敏度的分光特性&#xff0…

初识--数据结构

什么是数据结构&#xff1f;我们为什么要学习数据结构呢....一系列的问题就促使我们不得不了解数据结构。我们不禁要问了&#xff0c;学习C语言不就够了吗&#xff1f;为什么还要学习数据结构呢&#xff1f;这是因为&#xff1a;数据结构能够解决C语言解决不了的问题&#xff0…

ELK Stack、Kafka 和 Filebeat 认识和使用上手

ELK Stack、Kafka 和 Filebeat 认识和使用上手 ELK Stack 是一个强大的日志管理和分析平台&#xff0c;由 Elasticsearch、Logstash 和 Kibana 组成。Elasticsearch 负责存储和索引日志数据&#xff0c;Logstash 用于日志处理和转换&#xff0c;而 Kibana 提供可视化界面。在现…

外包干了3天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;19年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Linux第87步_阻塞IO实验

阻塞IO是“应用程序”对“驱动设备”进行操作&#xff0c;若不能获取到设备资源&#xff0c;则阻塞IO应用程序的线程会被“挂起”&#xff0c;直到获取到设备资源为止。 “挂起”就是让线程进入休眠&#xff0c;将CPU的资源让出来。线程进入休眠后&#xff0c;当设备文件可以操…

在线预约小程序怎么做

在快节奏的现代生活中&#xff0c;无论是预约理发、还是预定餐厅&#xff0c;亦或是挂号就医&#xff0c;我们都希望有一个更加便捷、高效的方式来完成这些任务。而今&#xff0c;随着科技的发展&#xff0c;一款全新的在线预约小程序应运而生&#xff0c;为我们的生活带来了前…

基于uni-app的埋点sdk设计

一、统计app激活状态 在App.vue 中 利用onShow生命周期验证 或者操作 onShow: function () { uni.showToast({ title: onShow }) }, 二、页面级别的统计 &#xff08;进入页面、停留时长、手机系统信息、网络状态、页面路径、标题&#xff09; 需要收集的数据 { &quo…