Java集合(Collection)之Set篇

JAVA学习-07-韩顺平老师

JAVA-集合(Collection)之Set篇

目录:

01-Set接口
02-HashSet类
02-LinkedHashSet类

Set接口

基本概念:

1)无序(添加和取出顺序不一致),没有索引。
2)不允许重复的元素,所以最多包含一个null。
3)JDK API中Set接口有很多的实现类,主要介绍HashSet和LinkedHashSet。

常用方法: 和List接口一样,Set接口也是List的子接口,所以常用方法和Collection一样可以参考以下文章:JAVA-集合Collection之List篇

遍历: 和Collection遍历方式一样,也可以参考上一篇文章,但是不能通过索引来获取,所以不能使用普通for来遍历:JAVA-集合Collection之List篇

HashSet类

基本介绍:

1.HashSet实现了Set接口。
2.HashSet实际上就是HashMap。
3.可以存放null值,但是只能有一个。
4.HashSet不保证元素是有序的,取决与hash后,在确定索引值。
5.不能有重复的元素。

HashMap基本原理:

当HashSet添加一个元素时,经历过程:
1.先对元素进行自动装箱操作,即转换为对象
2.然后获取元素的hash值(hashCode)方法.
3.对hash值进行运算,得出一个索引值,就是要存放在哈希表中的位置。
4.如果该位置上没有元素,就直接将元素存放到该位置。
5.如果该位置上有元素,就会将要添加的元素和已有的元素进行比较,
  如果相等就不再插入,如果不相等,则还会将其和已有元素链表上
  的其他元素进行比较,如果整条链表上没有相等的,插入在后面。

HashSet底层机制: HashSet的底层是HashMap类

1.HashSet的底层是HashMap,第一次添加时,table数组扩容为16,
  临界值(threshold)是16*加载因子(loadFactor)是0.75 * 16 = 12.
2.如果table数组的临界值为12,当数组再次扩容16*2 = 32,新的临
  界值就是32*0.75 = 24,以此类推。
临界值:临界值的作用就是当这个table加入的元素()超过了临界值的时候,
      table数组就会进行扩容,防止快到达临界值的时候有大量元素加入造成
      拥堵。
3.在java8中,如果一条链表的元素到达个个数超过了TREEIFY_THRESHOLD = 8,
  并且table的大小MIN_TRREEIFY_CAPACITY = 64(默认),就会进行树化,否则
  仍然采用数组扩容机制。

LinkedHashSet类

基本概念:

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

底层机制:

1.LinkedHashSet 中维护了一个Hash表和双向链表(LinkedHashSet有head和tail)。
2.每个节点都有pre和next属性,这样可以形成双向链表,
3.在添加一个元素的时候,与HashSet的添加机制一样,但是每个元素的添加进行都会
  通过pre和next链接起来,并且每添加一个元素tail就会指向那个添加的元素。
4.通过pre和next连接起来后,在遍历的时候就能确保输出顺序和插入顺序一致。

演示代码:

public class LinkedHashSet_ {
    public static void main(String[] args) {
        LinkedHashSet linkedHashSet = new LinkedHashSet();
        linkedHashSet.add("1");
        linkedHashSet.add("100");
        linkedHashSet.add("1000");
        linkedHashSet.add("100");
        for (Object obj : linkedHashSet) {
            System.out.print(obj + "\t"); // 1  100  1000 按插入顺序输出
        }

    }
}
Set实现类小结,欢迎大家交流学习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值