9_Set 系列集合
2020-12-02 本文已影响0人
真是个点子王
Set系列集合框架
- 添加的元素是无序、不重复和无索引的;
-- HashSet:添加的元素,是无序,不重复,无索引的。
-- LinkedHashSet:添加的元素,是有序,不重复,无索引的。
-- TreeSet: 不重复,无索引,按照大小默认升序排序!! ( 可排序集合 )
Set集合添加元素是如何做到去重的?
-
Java的Set集合中去除重复元素会进行两方面的处理:
- 首先Set集合会让两两对象调用其hashCode()方法来获得彼此的哈希值,如果哈希值不相同则判定为不等;
- 如果哈希值相同,则会继续调用两两对象中的equals()方法,如果相同才判定为重复;
- 在暂时的理解,可以暂时认为对于每一个对象的哈希值是唯一确定的。
- 因此,如果想要实现两个对象只要他们的属性重复就认为他们是重复的需求,就需要重写方法hashCode()和equals()方法
Set集合为何会是无序的?
- Set系列集合添加元素无序的根本原因是因为底层采用了哈希表存储元素。
- JDK 1.8之前:哈希表 = 数组 + 链表 + (哈希算法)
- JDK 1.8之后:哈希表 = 数组 + 链表 + 红黑树 + (哈希算法)
- 当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
LinkedHashSet
- LinkedHashSet底层依然是使用哈希表存储元素的,但是每个元素都额外带一个链来维护添加顺序!!
- 不光增删查快,还有序。缺点是多了一个存储顺序的链会占内存空间!!而且不允许重复,无索引。
TreeSet
- 无重复,无索引,按照大小默认升序排序
- TreeSet集合称为排序不重复集合,可以对元素进行默认的升序排序
- 但是,对于引用类型,若想实现排序功能,则需要进行适当处理:
- 为比较对象的类实现比较强规则接口Comparable,重写比较方法
public class Employee implements Comparable<Employee>{
private String name;
private double salary;
private int age;
// 重写了比较方法。
// e1.compareTo(o)
// 比较者:this
// 被比较者:o
// 需求:按照年龄比较
@Override
public int compareTo(Employee o) {
// 规则:Java规则
// 如果程序员认为比较者大于被比较者 返回正数!
// 如果程序员认为比较者小于被比较者 返回负数!
// 如果程序员认为比较者等于被比较者 返回0!
return this.age - o.age;
}
}
- 为集合设置比较器Comparator对象,重写比较方法
Set<Employee> employees = new TreeSet<>(new Comparator<Employee>()){
@Override
public int compara(Employee o1,Employee o2){
return o1.getAge() - o2.getAge();
}
}