set——无序的,不可重复的

本文详细介绍了Java集合框架中的Set接口实现类,包括LinkedHashSet的链表实现、TreeSet的红黑树排序原理和HashSet的哈希表结构。重点讨论了它们的特性、增删查改效率、去重机制以及在不同场景下的适用性。对于TreeSet,还讲解了内部比较器和外部比较器的使用,并强调了储存JavaBean数据时重写equals和hashcode方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

{通过单向链表实现Linkedlist

链表结构中数据以节点为单位}

一.

无序:存放的顺序与内部真实存储的数据顺序不一致

新增方法:static <E>Set<E>of{E...e(ements)}返回包含任意元素的不可修改值

遍历方式:foreath        iterator

二.

treeSet

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

特点:自动对数据做默认的升序排列

适用场景:想要实现去重,并且对数据需要默认排序情况

遍历方式:foreath        iterator

比较器:

1.内部比较器|自然排序

        实现comparable<T>接口,重写compareTo(T o)方法,方法体中指定比较规则

2.外部比较器|自定义排序

注意1:TreeSet去重,排序,都根据比较规则实现

             实现comparable<T>接口,重写compare方法,方法体中指定比较规则

注意2:如果指定外部比较规则,使用外部比较规则,没有指定外部,使用内部比较规则,都不在,抛出类型转换异常ClassCastException

使用treeSet储存javabean数据 要求实现比较规则,有外部找外部,没有外部默认找内部比较规则

三.

HashSet

        底层结构:哈希表(数据+列表+红黑树)

        特点:查询增删效率高,无序,去重

        应用场景:适合用在去重,无序

哈希表:jdk1.7及之前:数组加链表

              jdk1.8及之后:数组+链表+红黑树(链表为单向链表)

hashcode()返回对象的整数表达形式

来自于Object类的hashcode方法默认根据对象地址通过hash算法计算出来的整数

如果不满足计算方式,可以在子类中进行重写

1.调用数据的hashcode方法,得到一个int类型的整数(对象的整数表达形式)

        int hash = obj.hashcode();

2.把hashcode方法的返回值进一步进行hash算法的运算,得到位桶的索引

        int index = hash % 节点数组.length;

3.把数据存放到数组对应的index索引位置,但是在存放之前,需要考虑去重问题,

4.首先在数组[index]是否存在节点数据(链表头节点)

        1》如果没有存在链表头节点,直接存放当前数据节点为链表头

        2》如果存在链表头节点,从链表头节点开始遍历链表,拿每一个链表中的节点数据值与当前要储存的数据比较是否相等,调用equals方法进行比较,返回值为true,重复去重不存放,返回值为false,不相等继续遍历比较,如果整个链表没有equals相等的数据,把新数据挂在原链表的最后

当链表中的数据过多,会把当前链表优化为红黑树

储存JavaBean类型数据实现去重

需要javabean类型重写hashcode与equals方法,需要根据对象的属性值进行计算|判断,不能根据对象地址

注意:javabean的定义规范:

一个公共的类

属性私有化

至少提供一个空构造

一对公共的访问方式

重写toString和equals方法

重写hoshcode和equals方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值