Set系列集合、Map集合体系

本文详细介绍了Java集合框架中的Set系列集合和Map集合。Set系列包括HashSet、LinkedHashSet和TreeSet,其中HashSet基于哈希表,无序且不重复;LinkedHashSet保持插入顺序;TreeSet可排序但无索引。Map集合如HashMap、LinkedHashMap和TreeMap,HashMap无序、不重复,而TreeMap则支持自定义排序。文章还探讨了这些集合的底层原理、特点和使用场景。
摘要由CSDN通过智能技术生成

文章目录

一:Set系列集合

1.Set系列集戏概述

1.1Set系列集合特点
  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
1.2Set集合实现类特点
  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:可排序、不重复、无索引

Set集合的功能与Collection的API基本相同

public class SetDemo1 {
   
    public static void main(String[] args) {
   
        //看看Set集合的特点 HashSet LinkedHashSet TreeSet
        //HashSet无序、不重复、无索引
        Set<String> sets=new HashSet<>();//一行经典代码
        sets.add("MySQL");
        sets.add("MySQL");
        sets.add("Java");
        sets.add("Java");
        sets.add("HTML");
        sets.add("HTML");
        sets.add("SpringBoot");
        sets.add("SpringBoot");
        System.out.println(sets);//[Java, MySQL, HTML, SpringBoot]
        LinkedHashSet 有序、不重复、无索引
        Set<String> sets2=new LinkedHashSet<>();//一行经典代码
        sets2.add("MySQL");
        sets2.add("MySQL");
        sets2.add("Java");
        sets2.add("Java");
        sets2.add("HTML");
        sets2.add("HTML");
        sets2.add("SpringBoot");
        sets2.add("SpringBoot");
        System.out.println(sets2);//[MySQL, Java, HTML, SpringBoot]
    }
}

2.HashSet元素无序的底层原理:哈希表

2.1HashSet底层原理
  • HashSet集合采取哈希表存储的数据
  • 哈希表是一种对于增删改查数据性能都比较好的结构
2.2哈希表的组成
  • JDK8之前,底层使用数组+链表组成
    在这里插入图片描述

  • JDK8之后,底层采用数组+l链表+红黑树组成

在这里插入图片描述

2.3哈希值
  • 是JDK根据对象的地址,按照某种规则算出来的int类型的数值
  • Object类的API:public int hashCode();返回对象的哈希值
2.4对象哈希值的特点
  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值是不同的
public class SetDemo2 {
   
    public static void main(String[] args) {
   
        //目标学会获取对象的哈希值,并确认一下
        String name="itheima";
        System.out.println(name.hashCode());
        System.out.println(name.hashCode());
        String name1="itheima1";
        System.out.println(name1.hashCode());
        System.out.println(name1.hashCode());
    }
}

3.HashSet元素去重复的底层原理

在这里插入图片描述

3.1Set集合去重复案例
  • 需求:创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
  • 要求:学生对象的成员变量值相同,我们就认为是同一个对象
public class Student {
   
    private String name;
    private int age;
    private char sex;

    public Student() {
   
    }

    public Student(String name, int age, char sex) {
   
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public int getAge() {
   
        return age;
    }

    public void setAge(int age) {
   
        this.age = age;
    }

    public char getSex() {
   
        return sex;
    }

    public void setSex(char sex) {
   
        this.sex = sex;
    }

    /**
     * 只要两个对象内容一样,结果就是true
     * @param o
     * @return
     */
    @Override
    public boolean equals(Object o) {
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && sex == student.sex && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
   
        return Objects.hash(name, age, sex);
    }

    @Override
    public String toString() {
   
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}

//目标:让Set集合把重复内容去掉一个(去重复)
public class SetDemo3 {
   
    public static void main(String[] args) {
   
        //Set集合去重复原因,先判断哈希值,再判断equals
        Set<Student> sets=new HashSet<>();
        Student s1=new Student("小红",12,'女');
        Student s2=new Student("小红",12,'女');
        Student s3=new Student("小包",18,'女');
        sets.add(s1);
        sets.add(s2);
        sets.add(s3);
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
        System.out.println(s3.hashCode());
        System.out.println(sets);
    }
}

4.实现类:LinkedHashSet

1.集合概述和特点
  • 有序、不重复、无索引
  • 这里的有序指的是保证存储和取出的元素顺序一致
  • 原理:底层数据结构依然是哈希表,只是每个元素有额外多了一个双链表的机制记录存储的顺序

5.实现类:TreeSet

5.1TreeSet集合概述和特点
  • 不重复、无索引、可排序
  • 可排序:按照元素的大小默认升序(由小有大)排序
  • TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都比较好
  • 注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序
5.2TreeSet集合默认的规则
  • 对于数值类型:Ingeter,Double,官方默认按照大小进行升序排序
  • 对于字符串类型:默认按照首字符的编号升序排序
  • 对于自定义类型如Student对象,TreeSet无法直接排序
  • 结论:想要使用TreeSet存储自定义类型,需要制定排序规则
5.3自定义排序规则
  • TreeSet集合存储对象的时候有2种方式可以设计自定义比较规则
    方式一:
  • 让自定义的类(如学生类)实现Comparable接口重写里面的compareTo方法来制定比较规则
    方式二:
  • TreeSet集合有参构造器,可以设置Comparetor接口对应的比较器对象,来制定比较规则
    注意:如果TreeSet集合存储的对象有实现比较规则,集合也有自带比较器,默认使用集合自带的比较器排序
public class Apple implements Comparable<Apple>{
   
    private String name;
    private String color;
    private double price;
    private int weight;

    public Apple() {
   
    }

    public Apple(String name, String color, double price, int weight) {
   
        this.name = name;
        this.color = color;
        this.price = price;
        this.weight = weight;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public String getColor() {
   
        return color;
    }

    public void setColor(String color) {
   
        this.color = color;
    }

    public double getPrice() {
   
        return price;
    }

    public void setPrice(double price) {
   
        this.price = price;
    }

    public int getWeight() {
   
        return weight;
    }

    public void setWeight(int weight) {
   
        this.weight = weight;
    }


    @Override
    public boolean equals(Object o) {
   
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Apple apple = (Apple) o;
        return Double.compare(apple.price, price) == 0 && weight == apple.weight && Objects.equals(name, apple.name) && Objects.equals(color, apple.color);
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值