当前位置:   article > 正文

2020-11-08 HashSet、TreeSet、LinkedHashSet_set set=new hashset();

set set=new hashset();

HashSet

哈希值:是JDK根据对象的地址/字符串/数字算出来的int类型的数值。

Object类中有一个方法可以获取对象的哈希值。

  • 同一个对象多次调用hashCode()方法,返回的哈希值是相同的。
  • 默认情况下,不同对象的hash值是不相同的。通过方法重写,可以实现不同对象的哈希值是相同的。

HashSet集合概述和特点

  • HashSet对元素顺序不作保证,不保证存储和取出的元素顺序一致。
  • 底层数据结构是哈希表
  • 加上Set集合的2个特点:无重复,不可for循环(可增强for循环)

HashSet集合保证元素唯一性分析

要保证元素唯一性,需要重写hashCode()和equals()。

哈希表

  • JDK8之前,底层——数组+链表,是一个元素为链表的数组
  • JDK8之后,在长度较长的时候,底层实现了优化

LinkedHashSet

  • 底层——哈希表(元素唯一)和链表(存储数据有顺序)

TreeSet

  1. 元素有序,不是存取有序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
  •            TreeSet():根据其元素的自然排序进行排序,比如从小到大
  •            TreeSet(Comparator comparator):根据指定的比较器进行排序
  1. 没有带索引的方法,不能用普通for循环
  2. 是Set集合,不包含重复元素

Comparable的使用

  • 无参构造方法使用的是自然排序对元素进行排序;
  • 自然排序——让元素所属的类实现Comparable接口,重写ComparableTo(T 0)方法
  • 重写方法是,要注意排序规则必须按照要求的主要添加和次要条件来写
    1. //Student类别中
    2. public int compareTo(Student o) {
    3. // return 0;
    4. // return 1;
    5. // return -1;//按照添加逆序输出
    6. int num = this.age - o.age;
    7. int num2 = num == 0 ? this.name.compareTo(o.name) : num;
    8. return num2;
    9. }
    10. //main函数中应用
    11. for (Student student:students){
    12. System.out.println(student.getName()+","+student.getAge());
    13. }

    比较器Comparator的使用

  • 使用TreeSet集合存储对象时,带参构造方法使用的是比较器排序对元素进行排序的;
  • 比较器排序时——让集合构造方法接收Comparator的实现类对象,重写compare(T 01,T 02)方法
  • 重写方法时,一定要注意排序规则必须按照要求的主次条件写
  1. TreeSet<Student> students = new TreeSet<Student>(new Comparator<Student>() {
  2. @Override
  3. public int compare(Student o1, Student o2) {
  4. int num = o1.getAge() - o2.getAge();
  5. int num2 = num==0?o1.getName().compareTo(o2.getName()):num;
  6. return num2;
  7. }
  8. });
  1. Set<Integer> set = new HashSet<Integer>();//不会排序
  2. Set<Integer> set = new TreeSet<Integer>();//会排序

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/902134
推荐阅读
相关标签
  

闽ICP备14008679号