当前位置: 首页 > news >正文

【容器源码篇】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.lryc.cn/news/327210.html

相关文章:

  • 网络工程师实验命令(华为数通HCIA)
  • AI大模型学习:AI大模型在特定领域的应用
  • Channel 结合 Select 使用
  • LeetCode-1669题:合并两个链表(原创)
  • 微服务高级篇(三):分布式缓存+Redis集群
  • 机器学习——元学习
  • day56 动态规划part13
  • Mybatis别名 动态sql语句 分页查询
  • 【算法题】三道题理解算法思想--滑动窗口篇
  • go env 命令详解
  • flutter 单例模式
  • 1.7.2 python练习题15道
  • python如何获取word文档的总页数
  • python解压RAR文件
  • 灯哥驱动器端口讲解----foc电机驱动必看
  • lua 获取指定路径下的所有文件夹
  • #Linux(SSH软件安装及简单使用)
  • Android中运动事件的处理
  • 【网安小白成长之路】3.MySQL环境配置以及常用命令(增删改查)
  • 【QGIS从shp文件中筛选目标区域导出为shp】
  • react native hooks 如何避免重复请求
  • 【任职资格】某大型制造型企业任职资格体系项目纪实
  • 线程安全问题及解决
  • Excel·VBA数组平均分组问题
  • 高防服务器、高防IP、高防CDN的工作原理是什么
  • 【Flask开发实战】安装mysql数据库与配置连接
  • Java项目:79 springboot海滨体育馆管理系统的设计与实现
  • 17.注释和关键字
  • Mac上配置host
  • JAVA------基础篇