Java集合Set全解析:从HashSet到TreeSet
Hello,大家好,我是Yize,这两篇的更新速率是不是很快呢哈哈哈哈哈
在上期我们学习了List集合,所以这期就要和大家分享Set集合了,下面我们开始:
目录
在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;
}
);
原理:底层数据结构就是红黑树
好啦,本期的学习就到此结束啦,大家是不是发现这两期内容好多数据结构的知识呢,比如上期的链表呀,以及这期的红黑树,所以下期我们就来简单学习一下数据结构,其中包括栈与队列,链表,数等等,让我们敬请期待吧!!!
我们下次见!!!
更多推荐



所有评论(0)