Java Set基础篇

目录

  • 前言
  • 一、常用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的接口:

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集合,不允许重复元素。它通过哈希算法将元素存储在内部的哈希表中,提供了快速的查找和插入操作。

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 使用

    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集合,可以按照元素的自然顺序或自定义顺序进行排序。它提供了有序的遍历能力,支持高效的插入、删除和查找操作。

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

1.3.1 特点

TreeSet的特点:

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

1.3.2 使用

    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是一个不错的选择。

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

1.4.1 特点

LinkedHashSet的特点:

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

1.4.2 使用

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

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

并集demo

    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

 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 接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/533842.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

位图布隆过滤器的原理及实现

目录 位图的概念&#xff1a; 位图的前置知识&#xff1a;位运算 位图的实现&#xff1a; 位图的基本参数和构造方法&#xff1a; 位图的插入&#xff1a; 位图的查找&#xff1a; 位图的删除&#xff1a; 布隆过滤器概念&#xff1a; 布隆过滤器的实现&#xff1a; …

【软件测试之边界值法】

【软件测试之边界值法】(蓝桥杯学习笔记) 我们先来看一个 Java 小程序&#xff0c;如下图所示。 运行这个程序会发生什么事情呢&#xff1f;在这个程序中&#xff0c;目标是为了创建一个有 10 个元素的一维数组&#xff0c;但是&#xff0c;在 Java 语言中&#xff0c;当一个数…

win7无法升级win11,win7无法升级win11系统版本怎么解决

自动微软推出win11后,有不少小伙伴升级安装了。但是,有一些win7用户却安装win11失败,想知道有什么办法能让win7顺利升级win11。关于win7无法升级win11这个问题,最主要原因可能是你的电脑配置不够,毕竟升级win11的门槛要比升级win10还要高,而且还需要支持UEFI安全启动和TP…

Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)

一、项目简介 本项目是一套基于SSM框架实现的人力资源管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

局域网tcp通信实验

两台windows系统计算机简单TCP通信测试_两台计算机tcp通信-CSDN博客 使用这篇文章的小工具。 环境&#xff1a; 我和同学的两台笔记本电脑。 使用我的手机开热点&#xff0c;两台电脑连接热点。 我的&#xff1a; IPv4 地址 . . . . . . . . . . . . : 192.168.92.79 子…

labview技术交流-如何判断一个数是否为质数

问题起源 如何判断一个数是否为质数&#xff0c;其实并不难&#xff0c;只要你知道质数的定义&#xff0c;按照它的定义去编写代码就可以了。但是没有思路的人可能就会一直找不到方向&#xff0c;所以我就简单介绍一下。 还有我想吐槽的点&#xff0c;labview本来就是很小众的语…

【氧化镓】β-Ga2O3肖特基势垒二极管的缺陷识别

本文是一篇关于β-Ga2O3肖特基势垒二极管在电子辐射和退火调节下缺陷识别的研究。文章首先介绍了β-Ga2O3作为一种高性能器件材料的重要性&#xff0c;然后详细描述了实验方法&#xff0c;包括样品制备、电子辐照、热退火处理以及电学特性和深能级瞬态谱&#xff08;DLTS&#…

英特尔AI训练芯片惊艳亮相:速度与性能双超H200,引领AI新浪潮

英特尔甩出全新AI训练芯片&#xff01;跑千亿大模型速度超H200&#xff0c;罕见披露AI浮点性能 大规模AI计算已经进入系统竞赛。 英特尔在年度Intel Vision大会上重磅推出新一代AI训练芯片Gaudi 3&#xff0c;正面向英伟达旗舰芯片发起挑战。会上&#xff0c;英特尔CEO基辛格挥…

html页面跳转的方法

1、加在head里面 <head> <meta http-equiv"refresh" content"1;urlhttps://ha.huatu.com/zt/hnsylkseo/?"> </head> 2、加在body里面 在body里用js <script language"javascript" type"text/javascript">…

C++感受4-HelloWorld中文版——认识编码

及时了解“编码”对编写代码的影响&#xff0c;是中国程序员越早知道越好的知识点。 一分钟了解什么叫“编码”和“解码”&#xff1b;通过实际演示&#xff0c;充分理解中文Windows下&#xff0c;C源代码编码需要注意的地方&#xff1b;通过 -finput-charsetutf8 等 g 编译配置…

数据可视化-ECharts Html项目实战(11)

在之前的文章中&#xff0c;我们学习了如何在ECharts中特殊图表的双y图以及自定义形状词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECh…

【随笔】Git 高级篇 -- 纠缠不清的分支 rebase | cherry-pick(二十四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

基于特征的多模态生物信号信息检索与自相似矩阵:专注于自动分割

论文地址&#xff1a;Biosensors | Free Full-Text | Feature-Based Information Retrieval of Multimodal Biosignals with a Self-Similarity Matrix: Focus on Automatic Segmentation (mdpi.com) 论文源码&#xff1a;无 期刊&#xff1a;biosensors 这篇论文提出了一种基…

全国项目管理标准化技术委员会副秘书长肖杨先生受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 全国项目管理标准化技术委员会副秘书长、微薄之力&#xff08;北京&#xff09;管理咨询有限公司董事长肖杨先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“数字化时代下&#xff0c;由职能型组织向高度适应性组织转…

GCB Meta分析 | 土壤水分-大气反馈主导全球陆地N2O硝化的排放和反硝化的减少

原名&#xff1a;Soil moisture–atmosphere feedback dominates land N2O nitrification emissions and denitrification reduction 译名&#xff1a;土壤水分-大气反馈主导着陆地N2O硝化的排放和反硝化的减少 期刊&#xff1a;Global Change Biology 通讯作者&#xff1a…

OSCP靶场--Dibble

OSCP靶场–Dibble 考点(前端鉴权参数修改node.js代码注入 suid cp提权 ) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.173.110 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-09 06:36 EDT Nmap scan repor…

Golang | Leetcode Golang题解之第21题合并两个有序链表

题目&#xff1a; 题解&#xff1a; func mergeTwoLists(list1, list2 *ListNode) *ListNode {if list1 nil {return list2 // 注&#xff1a;如果都为空则返回空}if list2 nil {return list1}if list1.Val < list2.Val {list1.Next mergeTwoLists(list1.Next, list2)re…

一分钟了解机器人自由度

目录 自由度的定义 自由度的分类 自由度的影响 影响自由度的主要参数 关节类型和数量 机械结构 控制系统 自由度控制的硬件架构原理 传感器 执行器 控制器 通信接口 软件和算法 机器人的自由度是指机器人在空间中可以独立移动的方向和角度的数量&#xff0c;它是衡…

比特币减半后 牛市爆发

作者&#xff1a;Arthur Hayes of Co-Founder of 100x 编译&#xff1a;Qin jin of ccvalue (以下内容仅代表作者个人观点&#xff0c;不应作为投资决策依据&#xff0c;也不应被视为参与投资交易的建议或意见&#xff09;。 Ping PingPing&#xff0c;我的手机发出的声音&…

【Java】Java使用Swing实现一个模拟计算器(有源码)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 今天翻了翻之前写的代码&#xff0c;发现自己之前还写了一个计算器&#xff0c;今天把我之前写的代码分享出来。 我记得那会儿刚学不会写&#xff0c;写的乱七八糟&#xff0c;但拿来当期末作业还是不错的哈哈。 直接上…