Hello,大家好,我是Yize,这两篇的更新速率是不是很快呢哈哈哈哈哈

在上期我们学习了List集合,所以这期就要和大家分享Set集合了,下面我们开始:

目录

HashSet

LinkedHashSet

TreeSet


在Collection那篇我们看到,Set集合分为HashSet && LinkedHashSet && TreeSet,所以本期我们一个一个来,gogogo!!

话不多说,我们直接步入正题!!

HashSet

特点:无序,不重复,无索引

①创建一个默认长度16,默认加载因为0.75的数组,数组名table

                                             当数组存入16*0.75 = 12个元素时,数组进行二倍扩容

②根据元素的哈希值跟数组的长度计算出应存入的位置

③判断当前位置是否为null,如果是null直接存入

④如果位置不为null,表示有元素,则调用equals方法比较属性值

JDK8以前(数组+链表):新元素存入数组,老元素挂在新元素下面

JDK8以后(数组+链表+红黑树):新元素直接挂在老元素下面

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

LinkedHashSet

特点:有序,不重复,无索引

           存和取的顺序一致

原理:底层数据结构依然是哈希表,只是每个元素又额外多了一个双链表的机制记录存储的顺序

TreeSet

特点:不重复,无索引,可排序

排序默认规则:

1. 对于数据类型:Integer Double 从小到大排序

2. 对于字符,字符串类型:按照字符在ASCII码表中的数字升序进行排序

                                                              例如:aaa ab aba cd

3. 对于自定义类型有两种比较规则

        默认使用第一种,当第一种不满足需求时,再使用第二种

规则1:默认排序,JavaBean类实现Comparable接口指定比较规则

/重写compareTo方法/
/(学生类对象按年龄排序)/
@Override
public int compareTo(Student o) {
    return this.getAge() - o.getAge();
}
this:当前要存入的元素
o:红黑树已经存在的元素
return的如果是负数:要添加的元素数小,存左边
        如果是正数:要添加的元素数大,存右边
        如果是0:要添加的元素已存在,舍弃

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

//o1表示当前要添加的元素
//o2表示已经在红黑树存在的元素
//return返回值与第一种方法相同
TreeSet<String> t = new TreeSet<>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
    //自定义排序规则:按照字符串长度排序,如果字符串长度相同再按照字母排序
    int i = o1.length() - o2.length();
    i = i == 0 ? o1.compareTo(o2) : i;
        return i;
    }
});


当然,可以进行简化
TreeSet<String> t = new TreeSet<>(( o1,  o2) -> {
    int i = o1.length() - o2.length();
    i = i == 0 ? o1.compareTo(o2) : i;
    return i;
    }
);

原理:底层数据结构就是红黑树

好啦,本期的学习就到此结束啦,大家是不是发现这两期内容好多数据结构的知识呢,比如上期的链表呀,以及这期的红黑树,所以下期我们就来简单学习一下数据结构,其中包括栈与队列,链表,数等等,让我们敬请期待吧!!!

我们下次见!!!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐