Java的Set集合

文章介绍了如何手写LinkedList,Set集合的特点,如List和Set的有序性、重复性以及其实现类。着重讲解了TreeSet的底层红黑树结构和升序排序特性,以及它的各种操作方法。同时,文章讨论了比较器的概念,包括内部比较器(Comparable接口)和外部比较器(Comparator接口),用于自定义排序规则。最后提到了HashSet的底层逻辑结构(哈希表)及其在去重和性能上的优势。
摘要由CSDN通过智能技术生成

一、用单向链表手写LinkedList

二、Set集合

List:有序的,可重复的,可以根据

Set : 无序的(存储的顺序与内部真实存放 的顺序不保证一致),去重的,不可以根据

索引使用的

实现类:HashSet、TreeSet

set定义:不包含重复元素的集合 无新增方法

遍历方式 : foreach 、iterator

三、TreeSet

底层结构:红黑树(平衡二叉树)

特点:自动做升序排序

应用场景 : 适合应用在想要对数据根据指定规则做升序|降序排序的情况下

新增方法 : 新增了一些比较大小相关的方法

遍历方式:foreach Iterator descendingIterator(逆序)

此实现不同步

 //E ceiling(E e)
        //返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则null 。
        System.out.println(set.ceiling(3.1));
​
        //E floor(E e)
        //返回此集合中小于或等于给定元素的最大元素,如果没有这样的元素,则null 。
        System.out.println(set.floor(3.1));
​
        //E first()
        //返回此集合中当前的第一个(最低)元素。
        //E last()
        //返回此集合中当前的最后一个(最高)元素。
        System.out.println(set.first());
        System.out.println(set.last());
​
        //E higher(E e)
        //返回此集合中严格大于给定元素的最小元素,如果没有这样的元素,则null 。
        //E lower(E e)
        //返回此集合中严格小于给定元素的最大元素,如果没有这样的元素,则null 。
        System.out.println(set.higher(3.1));
        System.out.println(set.lower(3.1));
​
        //E pollFirst()
        //检索并删除第一个(最低)元素,如果此集合为空,则返回null 。
        //E pollLast()
        //检索并删除最后一个(最高)元素,如果此集合为空,则返回null 。
        System.out.println(set.pollFirst());
        System.out.println(set);

四、比较器

排序:boolean型:先false 后ture

char,String根据码排序

不同类型的集合与存储对象集合的不能默认排序

定义比较规则:

内部比较器|自然排序|默认比较规则:

要比较的类型实现Comparable接口,重写compareTo(T o)方法,方法的内部定义比较规则

TreeSet<Employee> set = new TreeSet<>(); //默认使用内部比较器(自然排序)
@Override
public int compareTo(Employee o) {
        //this : x : 101
        //o : y : 102
        //return this.no -  o.no; //根据员工编号做升序排序
        //return o.no -  this.no;  //根据员工编号做降序排序
        //return Double.compare(this.sal,o.sal); //根据薪资做升序
        return o.name.compareTo(this.name);  //根据员工姓名做降序排序
    }

外部比较器|定制排序|自定义比较规则:

实现类实现 Comparator<T>接口,重写compare(T o1, T o2) 方法,方法的内部定义比较规则

//外部比较器
class Test implements Comparator<Employee>{
​
    @Override
    public int compare(Employee o1, Employee o2) {
        return Double.compare(o1.getSal(),o2.getSal());
    }
}
//匿名内部类简化
TreeSet<Employee> set = new TreeSet<>(new Comparator<Employee>() {
            @Override
            public int compare(Employee o1, Employee o2) {
                return Double.compare(o2.getSal(),o1.getSal());
            }
        });
//lambda表达式
TreeSet<Employee> set = new TreeSet<>(( o1, o2) -> Double.compare(o1.getSal(),o2.getSal()));

五、HashSet

底层逻辑结构:哈希表(jdk1.7之前:数组+链表 1.7之后:数组+链表+红黑树)

特点:查询增删效率较高

应用场景:适合大量做查询增删的需求下

去重 : 一般结合业务都想要根据对象的内容做去重

在对象类型中根据内容重写hashCode与equals方法

注意 : 前提在根据内容重写 hashCode与equals方法之后 :

hashCode相等,equals一定相等 :不一定

equals相等,hashCode相等 : 一定相等

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值