{通过单向链表实现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方法