Java中的Set接口

本文介绍了Set接口的基础概念,重点剖析了HashSet、TreeSet和LinkedHashSet的特性和底层实现,包括添加元素的策略、扩容机制以及LinkedHashSet的顺序保持。
摘要由CSDN通过智能技术生成

Set接口和常用方法

基本介绍

  1. 无序(添加和取出的顺序不一致),没有索引(不可以通过索引获取其中的元素)
  1. 不允许从复元素,所以最多包含一个null
  1. JDK API中Set接口的实现类有:HashSet、TreeSet等
  1. Set接口的常用方法:和List一样,Set接口也是Collection的子接口,因此,常用方法和COllection接口一样
  1. Set接口的遍历方式
    1.可以使用迭代器
    2.增强for
    3.不能使用索引的方式来获取

HashSet的全面说明

  1. HashSet实现了Set接口
  1. HashSet实际上是HashMap
  1. 可以存放null只,但是只有一个null
  1. HashSet不保证元素是有序的,取决hash后,再确定索引的结果
  1. 不能有从复元素/对象

HashSet底层机制说明

  1. HashSet底层是一个HashMap
  1. 添加一个元素时,先的到hash值然后会转成->索引值
  1. 找到存储数据表table,看这个索引位置是否已经存放的有元素
  1. 如果没有直接加入
  1. 如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后。equals方法可以由自己决定,可以进行重写
  1. 在Java8中,如果一条链表的元素个数到达 TREEIFY_THRESHOLD(默认是8),并且table的大小 >= MIN_TERRIFY_CAPACITY(默认64),就会进行树化(红黑树);如果一条链表元素个数到8,单table没到64,就会先对table进行扩容

分析HashSet的扩容和转成红黑树机制

  1. HashSet底层是HashMap,第一次添加时,table数组扩容到16,临界值(threshold)是16*加载因子(loadFactor)是0.75 = 12
  1. 如果table数组使用到了临界值12,就会扩容到16 * 2=32,新的临界值就是32*0.75=24,依次类推
  1. 在Java8中,如果一条链表的元素个数到达 TREEIFY_THRESHOLD(默认是8),并且table的大小 >= MIN_TREEIFY_CAPACITY(默认64),就会进行树化(红黑树),否则仍然采用数组的扩容机制

LinkedHashSet的全面说明

  1. LinkedHashSet是HashSet的子类
  1. LinkedHashSet底层是一个LinkedHashMap底层维护了一个 数组 + 双向链表
  1. LinkedHashSet根据元素的hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的
  1. LinkedHashSet不允许添加从复元素

说明

  1. 在LinkedHashSet 中维护了一个hash表和双向链表(LinkedHashSet有head和tail)
  1. 每一个节点有pre和next属性,这样可以形成双向链表
  1. 在添加一个元素时,先求hash值,在求索引,确定该元素在hashtable的位置,然后将添加的元素加入到双向链表(如果已经存在,不添加[原则和hashset一样])
  1. 这样的话,我们遍历LinkedHashSet也能确保插入顺序和遍历顺序一致

解读

  1. LinkedHashSet 加入顺序和取出元素/数据的顺序一致
  1. LinkedHashSet 底层维护的是一个LinkedHashMap(是HashMap的子类)
  1. LinkedHashSet 底层结构(数组table+双向链表)
  1. 添加第一次时,直接将数组table扩容到 16 ,存放的节点类型是LinkedHashMap$Entry
  1. 数组是HashMap N o d e [ ] 存放的元素 / 数据是 L i n k e d H a s h M a p Node[] 存放的元素/数据是LinkedHashMap Node[]存放的元素/数据是LinkedHashMapEntry
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Set 接口Java 的一个接口,它继承了 Collection 接口,是一种不允许重复元素的集合。它有许多实现类,例如 HashSet 和 TreeSet,可用于存储一组无序的、不重复的元素。 ### 回答2: JavaSet接口是一种集合,它是java.util包的一部分。它是在Collection接口的基础上定义的,用于存储不重复的元素。Set接口不保证元素的顺序,也不允许存储重复的元素。 Set接口的特性可以总结如下: 1. 不允许存储重复的元素:Set接口的实现类会根据元素的值来判断是否重复,如果重复则不会被添加到Set。 2. 不保证元素的顺序:HashSetSet接口最常用的实现类,它使用哈希表数据结构来存储元素,不会按照插入顺序进行排序。而LinkedHashSet则会按照插入顺序进行排序。 3. 可以包含null元素:Set接口可以包含null元素,但是只能包含一个null元素,如果尝试添加多个null元素,只会保留一个。 Set接口提供了一系列常用的方法,如添加元素、删除元素、判断是否包含某个元素、获取元素个数等。一般情况下,我们使用Set接口来存储一组不重复的元素,以方便快速查找、去除重复元素等操作。 总之,Set接口Java是用来存储不重复元素的集合。它具有不保证元素顺序和不允许存储重复元素的特性。我们可以使用Set接口来进行快速查找和去除重复元素的操作。 ### 回答3: 在JavaSet接口是一种集合接口,它是java.util包的一部分。Set接口继承自Collection接口,并且是一种不允许包含重复元素的集合。它是基于数学的集合概念而设计的。 Set接口的特点是: 1. 不允许重复元素:Set不允许包含重复的元素,如果试图将重复的元素添加到Set,则添加操作会被忽略。 2. 无序性:Set的元素没有特定的顺序,即不保证元素的存储顺序和插入顺序相同。 3. 无索引:Set接口不提供索引访问元素的方法,因为元素没有固定的位置。 4. 提供了高效的查找和判断功能:Set接口提供了contains()方法用于判断是否包含某个元素,以及size()方法获取Set元素的个数。 JavaSet接口有几个常用的实现类,例如HashSet、LinkedHashSet和TreeSet。 - HashSet是基于哈希表实现的Set接口,它提供了最快的查找速度,元素的顺序是不确定的。 - LinkedHashSet继承自HashSet,内部通过链表维护元素的插入顺序,所以可以按照插入顺序遍历元素。 - TreeSet是基于红黑树实现的Set接口,它可以保证元素有序。按照元素的自然顺序或者通过Comparator来进行排序。 Set接口在实际编程经常用于去重、查找元素以及判断元素的存在与否等场景。它提供了一种快速、高效且简洁的方式来处理元素集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值