集合进阶--Set集合系列--2023/3/13

问题导航

1.List系列集合与set系列集合区别

2.set系列集合特点

3.set集合的实现类特点

4.HashSet底层数据结构

5.HashSet的底层原理

6.哈希值

7.对象的哈希值特点

8.HashSet为什么存和取的顺序不一样?

9.HashSet为什么没有索引?

10.HashSet是利用什么机制保证数据去重?

11.LinkedHashSet集合的特点和原理

12.TreeSet的特点

13.TreeSet的两种比较方式

14.方法返回值的特点

1.List系列集合与set系列集合区别

List系列集合

添加的元素是有序,可重复,有索引

Set系列集合

添加的元素是无序,不重复,无索引

如果想要集合中的元素可重复

用ArrayList,基于数组

如果想对集合中的元素去重

用HashSet集合,基于哈希表

如果集合中的元素可重复,而且当前增删操作明显多于查询

用LinkList集合,基于链表

如果想对集合中的元素去重,而且保证存取顺序

用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet

如果想对集合中的元素进行排序

用TreeSet集合,基于红黑树

2.set系列集合特点

集合进阶--Set集合系列--2023/3/13_第1张图片

3.set集合的实现类特点

 集合进阶--Set集合系列--2023/3/13_第2张图片

集合进阶--Set集合系列--2023/3/13_第3张图片

4.HashSet底层数据结构

数组+链表+红黑数

5.HashSet的底层原理

集合进阶--Set集合系列--2023/3/13_第4张图片

6.哈希值

7.对象的哈希值特点

 8.HashSet为什么存和取的顺序不一样?

HashSet存储元素的顺序并不是按照存入时的顺序,是按照哈希值来存的,所以取数据也是按照哈希值来取得

9.HashSet为什么没有索引?

HashSet底层数据结构是数组+链表+红黑数,无法确定索引

10.HashSet是利用什么机制保证数据去重?

利用HashCode方法和equals方法保证数据去重

利用HashCode方法可以得到Hash值,而哈希值可以确定当前元素存放在数组的位置,

再去调用equals方法去比较对象内部的属性值是不是相同

如果HashSet中存储的是自定义方法,一定要重写HashCode方法和equals方法,如果没有重写,计算哈希值时就是用地址值计算的.

数据去重,默认使用HashSet,如果要求去重且存取有序,才使用LinkedHashSet

11.LinkedHashSet集合的特点和原理

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

原理:底层基于哈希表,使用双链表记录添加顺序

12.TreeSet的特点

集合进阶--Set集合系列--2023/3/13_第5张图片

13.TreeSet的两种比较方式

方式一:

方式二:

14.方法返回值的特点

负数:表示当前要添加的元素是小的,存左边

正数:表示当前要添加的元素是大的,存右边

0:表示当前要添加的元素已经存在,舍弃

import java.util.TreeSet;

/**
 * *需求:创建5个学生对象
 * (姓名,年龄,语文成绩,彀学成绩,英语成绩).
 * 按照总分从高到低输出到控制台
 * 如果总分一样,按照语文成绩排
 * 如果语文一样,按照数学成绩排
 * 如果数学成绩一样,按照英语成绩排
 * 如果英文成绩一样,按照年龄排
 * 如果年龄一样,按照姓名的字母顺序排
 * 如果都一样。认为是同一个学生。不存。
 */

public class A08_TreeSetDemo2 {
    public static void main(String[] args) {
    Student2 s1=new Student2("张三",21,89,66,75);
    Student2 s2=new Student2("王二",20,95,74,35);
    Student2 s3=new Student2("李四",21,69,88,54);
    Student2 s4=new Student2("白七",22,38,70,26);
        TreeSet ts=new TreeSet<>();
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        for (Student2 t : ts) {
            System.out.println(t);
        }

    }
}
public class Student2 implements Comparable{
    private String name;
    private int age;
    private int chinese;
    private int math;
    private int english;

    public Student2() {
    }

    public Student2(String name, int age, int chinese, int math, int english) {
        this.name = name;
        this.age = age;
        this.chinese = chinese;
        this.math = math;
        this.english = english;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 获取
     * @return chinese
     */
    public int getChinese() {
        return chinese;
    }

    /**
     * 设置
     * @param chinese
     */
    public void setChinese(int chinese) {
        this.chinese = chinese;
    }

    /**
     * 获取
     * @return math
     */
    public int getMath() {
        return math;
    }

    /**
     * 设置
     * @param math
     */
    public void setMath(int math) {
        this.math = math;
    }

    /**
     * 获取
     * @return english
     */
    public int getEnglish() {
        return english;
    }

    /**
     * 设置
     * @param english
     */
    public void setEnglish(int english) {
        this.english = english;
    }

    public String toString() {
        return "Student2{name = " + name + ", age = " + age + ", chinese = " + chinese + ", math = " + math + ", english = " + english + "}";
    }

    @Override
    public int compareTo(Student2 o) {
       /* (姓名,年龄,语文成绩,彀学成绩,英语成绩).
       按照总分从高到低输出到控制台
       如果总分一样,按照语文成绩排
       如果语文一样,按照数学成绩排
       如果数学成绩一样,按照英语成绩排
       如果英文成绩一样,按照年龄排
       如果年龄一样,按照姓名的字母顺序排
       如果都一样。认为是同一个学生。不存。*/

        int sum1=this.getChinese()+this.getMath()+this.getEnglish();
        int sum2=o.getChinese()+o.getMath()+o.getEnglish();
        int i = sum1 - sum2;
        i=i==0?this.getChinese()-o.getChinese():i;
        i=i==0?this.getMath()-o.getMath():i;
        i=i==0?this.getEnglish()-o.getEnglish():i;
        i=i==0?this.getAge() -o.getAge():i;
        i=i==0?this.getName().compareTo(o.getName()):i;

        return i;
    }
}

你可能感兴趣的:(数据结构,链表,java)