Java基础——Set集合

一、引言

Java中的Set集合是一种常用的数据结构,它类似于数学中的集合概念,可以存储不重复的元素。Set集合提供了高效的查找、插入和删除操作,能够帮助我们轻松地管理数据,并且在处理数据时具有很好的性能表现。在Java编程中,Set集合的独特特性使得它成为处理唯一性数据的重要工具之一。

二、Collection集合

  • 是List和Set的父接口
  • 所有集合都是由Collection或者Map派生

特点

  1. 内部存放List和Set的共性方法
  2. 没有直接实现类

三、Set的存储特点

无序,无下标,元素不可重复

四、Set的常用实现类

  1. HashSet

    • JDK1.2 底层哈希表(数组+链表)实现 线程不安全,效率高
  2. LinkedHashSet

    • JDK1.2 使HashSet的子类,底层哈希表实现 线程不安全,效率高
  3. TreeSet(实现的是Set集合的子接口SortedSet,TreeSet里面的排序方法全来自于它)

    • JDK1.2 底层红黑树实现,是SortedSet的实现类 线程不安全,效率高

    红黑树:树状结构存放数据,使用的是二分查找法,特点为查询效率快

五、创建

  • 建议使用多态
Set<泛型> 集合名=new 实现类名<>();

六、常用方法

  • 所有方法都继承自Collection,无独有方法

七、遍历

  1. 迭代器遍历
  2. 外遍历forEach
  3. 自遍历forEach

八、哈希表的去重原理

  1. 先调用元素的hashCode方法获取哈希码值
  2. 通过哈希码值%数组长度(16)得到存放下标
  3. 如果下标位置未存有元素,则直接存放
  4. 如果下标位置存有元素, 则调用当前元素的equals方法与下标位置元素进行值的比较
  5. 都不相同, 在下标位置上继续链表存放
  6. 有相同,则舍弃添加当前元素

九、使用

  1. HashSet和LinkedHashSet如果存放的是自定义类型,则必须重写hashCode和equals方法才能实现去重

  2. LinkedHashSet可以保证元素存入与取出的顺序一致

  3. TreeSet可以实现对元素进行默认的升序排序

    • 如果TreeSet中存放的是自定义类型,则必须自定义排序规则

    • 排序方式:

      1. 实现Comparable接口,重写CompareTo方法

        • 思路:让当前对象this和参数对象o进行比较

        • 实现:对谁排序,就让谁实现

        • 规则:

          • 从小到大:

            this的值>o的值,返回正数

            this的值<o的值,返回负数

          • 从大到小:

            this的值>o的值,返回负数

            this的值<o的值,返回正数

            相等返回0

        package com.by.entity;
        
        public class Student implements Comparable<Student>{
            private String name;
            private int age;
            private double score;
        
            //省略getter、setter、构造
        
            @Override
            public int compareTo(Student o) {
                //根据学生成绩从高到底排序
                if (this.score > o.score) {
                    return -1;
                } else if (this.score < o.score) {
                    return 1;
                }
                return 0;
            }
        }
        
        
      2. 实现Comparator接口,重写compare方法

        • 思路: 让参数o1和o2进行比较
        • 实现:在集合创建处的小括号内传入实现类对象
        Set<Student> set = new TreeSet<>((o1,o2)->{
                    //根据学生成绩从低到高
                    if (o1.getScore() > o2.getScore()) {
                        return 1;
                    } else if (o1.getScore() < o2.getScore()) {
                        return -1;
                    }
                    return 0;
                });
        
      1. 默认识别Comparable,但是Comparator优先级更高
      2. Comparator更能保护类的单一职责,有利于后期代码的维护, 集合排序扩展性更高,更推荐该方式
  4. TreeSet去重规则:当compareTo或compare方 法返回值为0时去重

十、结语

Set集合作为Java编程中常用的数据结构之一,在实际编程中具有广泛的应用,我们要熟悉掌握它,只不过Set集合使用场景没有List集合多。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值