J集合Set(HashSet(重写HashCode、equals比较对象的属性值)、LinkedHashSet、TreeSet(实现Comparable、创建对象时传递Comparator比较器))

利用不重复的这个特点,我们可以用于查重

Set继承了Collection中的所有方法(同时继承了三种遍历方式:迭代器遍历、增强for遍历、Lambda表达式遍历

1.HashSet(无序、不重复、无索引)(底层采用哈希表存储数据,哈希表是一种增删改查数据性能都较好的结构)

JDK8之前:数组+链表

JDK8开始:数组+链表+红黑树

哈希值:对象的整数表现形式(没有重写hashcode方法,不同的对象hashcode值不相同;重写了hashcode方法,不同的对象属性值相同,hashcode值相同)(如果参数是自定义类型时,需要重写hashCode和equals方法)

当数组中的数据超过0.75时,将会自动扩容,扩容到数组的两倍

当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树

问题一:HashSet为什么存和取的顺序不一样?

因为在JDk8以后,新元素直接挂在老元素后面,所以无法确定其中的数据是第几个存入的,因而存和取的顺序不一样。

问题二:HashSet为什么没有索引?

因为在JDK8以后,HashSet是由数组+链表+红黑树组合而成的,不好规定数据的索引。

问题三:HashSet是利用什么机制保证数据去重的?

利用HashCode方法和equals方法,利用equals判断哈希值。(用于自定义对象时)

2.LinkedHashSet(有序、不重复、无索引)(底层数据结构依然是哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序)

LinkedHashSet继承于HashSet,底层数据结构是哈希表和双向链表,因而我们存入数据和取出数据的顺序是一样的,即是有序的。

3.TreeSet(可排序、不重复、无索引)(底层数据结构是红黑数,不需要重写HashCode和equals)

由图我们知道TreeSet可以自动排序,那么TreeSet的排序规则是什么呢?

TreeSet的两种比较规则: 

                                  方式一:默认排序:Javabean类实现Comparable接口指定比较规则

默认使用第一种,如果第一种不能满足当前需求,就是用第二种

                     方式二:比较器排序,创建TreeSet对象的时候,传递比较器Comparator指定规则 

Collection单列集合家族中常用的有5种,那么我们应该什么情况下用什么样的集合呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值