【容器源码篇】Set容器(HashSet,LinkedHashSet,TreeSet的特点)

文章目录

  • ⭐容器继承关系
    • 🌹Set容器
      • 🗒️HashSet源码解析
        • 构造方法
          • public HashSet()
          • public HashSet(Collection<? extends E> c)
          • public HashSet(int initialCapacity, float loadFactor)
          • HashSet(int initialCapacity, float loadFactor, boolean dummy)
          • public HashSet(int initialCapacity)
        • 常用方法
      • 🗒️LinkedHashSet源码解析
        • 构造函数
      • 🗒️TreeSet源码解析
        • 构造函数
        • add方法
        • addAll方法

在这里插入图片描述

⭐容器继承关系

在这里插入图片描述

🌹Set容器

Set用于存储不重复元素的集合。Set接口继承自Collection接口,不允许包含重复元素,并且没有指定顺序。常见的Set实现类有HashSet、LinkedHashSet和TreeSet。

🗒️HashSet源码解析

不允许重复元素:HashSet不允许存储重复的元素,如果试图向HashSet中添加一个已经存在的元素,那么添加操作将会失败。

无序性:HashSet不保证集合中元素的顺序,即元素在集合中没有特定的顺序。具体的遍历顺序取决于元素的哈希码。

基于哈希表:HashSet内部是通过HashMap来实现的。HashSet中的元素作为HashMap的key,而value则是一个固定的Object对象。

添加、删除、包含操作的时间复杂度都是O(1):由于HashSet基于哈希表实现,对于添加、删除和包含操作的时间复杂度都是常数级别的,因此具有很高的性能。

构造方法
public HashSet()

创建一个空的HashMap,一个空HashMap的默认容量是16,装载因子是0.75
在这里插入图片描述

public HashSet(Collection<? extends E> c)

创建一个包含集合c中所有不重复元素的HashSet集合
在这里插入图片描述

public HashSet(int initialCapacity, float loadFactor)

创建一个具有指定容量和负载因子的HashMap
在这里插入图片描述

HashSet(int initialCapacity, float loadFactor, boolean dummy)

创建一个具有指定容量和负载因子的LinkedHashMap,这个包私有构造函数只被LinkedHashSet使用
在这里插入图片描述

public HashSet(int initialCapacity)

创建一个具有指定容量的HashMap
在这里插入图片描述

常用方法
	// 返回集合中元素的个数public int size() {return map.size();}// 返回集合是否为空public boolean isEmpty() {return map.isEmpty();}// 返回集合中是否包含指定元素opublic boolean contains(Object o) {return map.containsKey(o);}// 添加指定元素e// 将e作为HashMap的key 常量PRESENT作为所有元素的valuepublic boolean add(E e) {return map.put(e, PRESENT)==null;}// 移出指定元素opublic boolean remove(Object o) {return map.remove(o)==PRESENT;}// 清空集合中所有元素public void clear() {map.clear();}

🗒️LinkedHashSet源码解析

LinkedHashSet是HashSet的子类,并且内部使用链表维护元素的插入顺序。下面是LinkedHashSet的一些特点和使用方法:

保持插入顺序:与HashSet不同的是,LinkedHashSet会按照元素插入的顺序来维护集合中的元素。遍历LinkedHashSet时可以按照元素插入的顺序进行访问。

基于哈希表和链表:LinkedHashSet内部既使用哈希表来存储元素,又使用链表来维护元素的插入顺序。

性能表现:与HashSet相比,LinkedHashSet在添加、删除和包含操作的性能方面略低一些,因为需要同时维护哈希表和链表。

构造函数

在这里插入图片描述

🗒️TreeSet源码解析

有序性:TreeSet会对元素进行排序,并且可以按照自然顺序或者自定义排序规则来进行排序。默认情况下,TreeSet会按照元素的自然顺序进行排序,或者在构造函数中传入Comparator对象以自定义排序规则。

不允许null元素:TreeSet不允许添加null元素,因为它使用元素的比较规则来维护顺序,而null无法比较大小。

性能表现:TreeSet的添加、删除和包含操作的时间复杂度为O(log n),其中n为TreeSet中的元素个数。

构造函数

在这里插入图片描述

add方法

在这里插入图片描述
在这里插入图片描述

addAll方法

在这里插入图片描述
判断当前集合是否为空且指定集合不为空,并且指定集合为SortedSet类型,当前集合为TreeMap类型。
如果满足以上条件,则将指定集合转换为SortedSet类型,将当前集合转换为TreeMap类型。
比较指定集合的比较器和当前集合的比较器是否相等,如果相等,则使用线性时间版本的添加方式:map.addAllForTreeSet(set, PRESENT)。
在这里插入图片描述

如果不满足以上条件,则调用父类的addAll方法进行添加操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024蓝桥杯每日一题(背包)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;货币系统 试题二&#xff1a;01背包问题 试题三&#xff1a;完全背包问题 试题一&#xff1a;货币系统 【题目描述】 给定 V 种货币&#xff08;单位&#xff1a;元&#xff09;&#xff0c;每…

JAVA 100道题(21)

21.编写一个Java程序&#xff0c;使用多线程实现两个数的同时累加。 在Java中&#xff0c;我们可以使用多线程来实现两个数的同时累加。下面是一个简单的示例&#xff0c;其中创建了两个线程&#xff0c;每个线程负责累加不同的数字。 请注意&#xff0c;此示例假设我们要同时…

【ZZULIOJ】1008: 美元和人民币(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 美元越来越贬值了&#xff0c;手上留有太多的美元似乎不是件好事。赶紧算算你的那些美元还值多少人民币吧。假设美元与人民币的汇率是1美元兑换6.5573元人民币&#xff0c;编写程序输入美元的金额&a…

【实体字段校验:@NotNull、@NotEmpty、@NotBlank详解】

文章目录 前言1. NotNull1.1 什么是NotNull&#xff1f;1.2 使用步骤1.2.1 引入依赖1.2.2 在字段上添加注解 1.3 示例代码1.4 应用场景 2. NotEmpty2.1 什么是NotEmpty&#xff1f;2.2 使用步骤2.2.1 引入依赖2.2.2 在字段上添加注解 2.3 示例代码2.4 应用场景 3. NotBlank3.1 …

VLAN实验记录---对抗遗忘

sw1的接口6应该调成混杂模式&#xff0c;因为pc2,4,5,6的pvid各不相同而网段相同&#xff0c;所以往上去路由时应该剥离标记&#xff08;VLAN里面是标记而不是标签&#xff09;出去&#xff0c;这样 路由器上的物理接口用来管理不带标记的流量&#xff0c;而vlan2流量的往上打上…

记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端

开头 最近刷短视频看到了很多关于AI绘图&#xff0c;Midjourney&#xff0c;gittimg.ai&#xff0c;Stable Diffusion等一些绘图AI工具&#xff0c;感受到了AI绘画的魅力。通过chatGPT生成关键词再加上绘图工具&#xff0c;真是完美&#xff0c;文末教大家如何用gpt提词 Midj…

解决Windows Edge兼容性问题:一站式修复指南

解决Windows Edge兼容性问题&#xff1a;一站式修复指南 1. 引言1.1. Windows Edge的重要性1.2. 面对兼容性挑战 2. Windows Edge简介2.1. Windows Edge的特点2.2. 兼容性挑战 3. Windows Edge兼容性问题诊断3.1. 识别问题3.2. 检查系统更新 4. Windows Edge兼容性问题修复4.1.…

每日算法之接雨水

题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1…

打造核心竞争力:高效Web系统数据中台的设计与实践_光点科技

在数字化的浪潮中&#xff0c;数据已经成为企业赖以生存和发展的核心资源。一个高效的Web系统数据中台&#xff0c;能够赋予企业在激烈的市场竞争中立于不败之地的能力。本文将深入探讨如何设计和实施一个能够提升企业数据管理水平和支持业务决策的高效数据中台架构。 数据中台…

【YOLOv8训练结果评估】YOLOv8如何使用训练好的模型对验证集进行评估及评估参数详解

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

P8623 [蓝桥杯 2015 省 B] 移动距离 Python

[蓝桥杯 2015 省 B] 移动距离 题目描述 X 星球居民小区的楼房全是一样的&#xff0c;并且按矩阵样式排列。其楼房的编号为 $1,2,3, \cdots $ 。 当排满一行时&#xff0c;从下一行相邻的楼往反方向排号。 比如&#xff1a;当小区排号宽度为 6 6 6 时&#xff0c;开始情形如…

腾讯云优惠券领取及使用常见问题解答

随着云计算的普及&#xff0c;腾讯云作为国内领先的云计算服务提供商&#xff0c;为越来越多的企业和个人提供了丰富的云产品和服务。为了帮助用户更好地了解和使用腾讯云优惠券&#xff0c;本文将为大家解答关于腾讯云优惠券领取及使用的常见问题。 一、腾讯云优惠券概述 腾讯…

Centos7 安装一个ftp服务

在CentOS 7上安装和配置FTP服务器的步骤如下: 安装vsftpd: sudo yum install vsftpd启动vsftpd服务: sudo systemctl start vsftpd设置vsftpd在系统启动时自动启动: sudo systemctl enable vsftpd配置vsftpd: sudo vi /etc/vsftpd/vsftpd.conf在vsftpd.conf文件中,你可以进行各…

软件设计师24--概念设计阶段

软件设计师24--概念设计阶段 考点1&#xff1a;概念设计过程考点2&#xff1a;E-R图属性E-R模型-联系类型判断例题&#xff1a;E-R模型-联系类型判断扩充的E-R模型 考点1&#xff1a;概念设计过程 需求分析 --> 抽象数据 --> 设计局部ER模型 --> 合并局部模型消除冲突…

Java封装、继承、多态和抽象深度解析

在软件工程的世界里&#xff0c;面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用“对象”来设计软件。对象可以封装数据和方法&#xff0c;以提高代码的复用性、可维护性和可扩展性。Java作为一门面向对象的编程语言&#xff0c;提供了四个基本的面向…

二维前缀和与二维差分的表示

前缀和&#xff1a; 上述图片是求范围内的总和的图和公式 上述图片是初始化前缀和数组的图和公式 差分&#xff1a; 上图是差分公式 #include<iostream> #include<climits> #include<algorithm> #include<cstring> #include<cstdio> #include&l…

vue 借助vue-amap插件对高德地图的简单使用

需求&#xff1a;实现点击获取经纬度、定位、对特殊位置标点及自定义信息窗体功能。 高德地图的官网API&#xff1a;概述-地图 JS API 1.4 | 高德地图API vue-amap的中文文档&#xff1a;组件 | vue-amap 实现&#xff1a; 1、安装vue-amap插件 npm install vue-amap --save…

代码随想录第23天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 669. 修剪二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 你修剪的方式不对&#xff0c;我来给你纠正一下&#xff01;| LeetCode&#xff1a;669. 修剪二叉搜索树_哔哩哔哩_bilibili 给你二叉搜索树的根节点 root …

大数据之scala

为什么学习scala spark是新一代内存级大数据计算框架&#xff0c;是大数据的重要内容 spark就是使用scala编写的&#xff0c;因此为了更好的学习spark&#xff0c;需要掌握scala这门语言 spark的兴起&#xff0c;带动scala语言的发展 scala发展历史 联邦理工学院的马丁 奥德…

【卡梅德生物】哺乳动物表达常用的细胞系简介

在哺乳动物细胞表达系统中&#xff0c;受体细胞是用于表达外源基因或蛋白质的宿主细胞。哺乳动物细胞在重组蛋白的生产中起着至关重要的作用&#xff0c;并且选择哺乳动物细胞是综合有效表达外源基因、支持适当的蛋白质折叠和翻译后修饰以及提供高蛋白质产量的能力等因素。以下…