欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > Java学习打卡-Day19-Set、HashSet、LinkedHashSet

Java学习打卡-Day19-Set、HashSet、LinkedHashSet

2025/3/20 6:32:33 来源:https://blog.csdn.net/SLFG_Ts/article/details/146346966  浏览:    关键词:Java学习打卡-Day19-Set、HashSet、LinkedHashSet

Set 接口

  • 无序(添加和取出顺序不一致)(但取出顺序固定)。
  • 没有索引。
  • 不允许重复,所以最多一个null
  • 遍历方式
    1. 迭代器
    2. 增强for循环
    3. 不能使用普通for循环索引方式。

HashSet

  • 实现了Set接口,具有相应特征。
  • 底层实际是HashMap,HashMap底层是数组+链表/红黑树
  • add()方法会返回一个boolean值,表示添加成功/失败。
    	Set set = new HashSet();set.add("Lucy");set.add("Lucy");//Falseset.add(new Dog ("tom"));set.add(new Dog ("tom"));//True。//由于 Dog 类没有重写 equals 和 hashCode 方法,//这两个 Dog 对象会被认为是不同的对象,因此这个 Dog 对象也会被添加到 set 中。set.add(new String("hsp"));set.add(new String("hsp"));//False//再次添加一个新的 String 对象,虽然它是通过 new String("hsp") 创建的,//但 String 类重写了 equals 和 hashCode 方法,因此这两个 String 对象被认为是相同的,不会被重复添加。
    
  • HashSet 不允许重复元素,判断重复的依据是 equals 和 hashCode 方法。
HashSet 添加元素底层实现
  1. 先得到元素Hash值,转换成数组索引值。
  2. 找到table数组的索引位置有无元素。
  3. 没有则直接加入;有则调用equals方法比较,相同则放弃添加,不同则与下一个链接的元素比较···
HashSet 扩容机制与树化机制
  1. 首次添加元素,table扩容至16。临界值threshold=加载因子loadFactor(0.75)*16=12。
  2. 如果元素个数达到临界值12,则table扩容两倍为32。 此时临界值threshold=加载因子loadFactor(0.75)*32=24·····
  3. 如果一条链表的元素个数达到8,并且table大小达到64,则该链表将进行树化。否则仍采用扩容机制

LinkedHashSet

  • 继承了HashSet,实现了Set接口,具有相应特征。
  • 添加和取出顺序一致咯。
  • 底层实际是LinkedHashMap,LinkedHashMap底层是数组+双向链表
  • 双向链表有head和tail,每一个节点有pre和next。
  • 数组是HashMap$Node[],存放的元素是LinkedHashMap$Entry类型。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com