Set系列集合
-
无序:存取顺序不一样
-
不重复:可以去除重复的
-
无索引:没有带索引的方法,所以不能使用普遍for循环遍历,不能用索引获取元素
set集合的实现类
-
HashSet:无序 不重复 无索引
-
LinkedHashSet:有序 不重复 无索引
-
TreeSet:可排序 不重复 无索引
Set接口中的方法上基本与Collction的API一致
哈希值
-
根据hashCode方法算出来的int类型的整数
-
该方法定义在Object类中,所有对象都可以调用,默认用地址值计算
-
一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值
对象哈希值的特点
-
如果没有重写hashCode方法,,不同的对象计算出的哈希值是不同的
-
如果已经重写hashCode方法,不同的对象只要属性值相同,计算出的哈希值就一样的
-
在小部分情况下,不同的属性值或不同的地址值计算出来的哈希值也就有可能一样(哈希碰撞)
HashSet底层原理
-
创建一个默认长度为16,默认加载因子0.75的数组,数组名table
-
根据元素的哈希值跟数组的长度计算出应存入的位置
-
判断当前位置是否为null,如果是null直接存入
-
如果位置不为null,表示有元素,则调用equals方法比较属性值
-
一样:不存 不一样:存入数组,形成链表
LinkedHashSet底层原理
有序 不重复 无索引
有序:保证存储和取出的元素顺序一致
原理:底层数据结构依然是哈希表,只是每个元素有额外的多了一个双链表的机制记录存储的顺序
TreeSet
对数值类型,默认按从小到大的顺序排序
对字符 字符串类型,按照字符在ASCII码表中的数字进行排序
特点:可排序 不重复 无索引,底层基于红黑树实现排序,增删改查性能良好
TreeSet的排序规则
-
Javabean实现compavable接口,指定比较规则
-
创建集合时,自定义comparator比较器对象,指定比较规则
默认第一种 当第一种不满足时用第二种
方法返回值的特点
负数:表示当前要添加的元素是小的存左边
正数:表示当前要添加的元素是大的村右边
0:表示当前要添加的元素已存在 舍弃
注意
1.如果想要集合中的元素可重复
用ArrayList集合
2.如果想要集合中的元素可重复,且增删操作明显多于查询
用LinkedList集合,基于链表的
3.如果相对集合中的元素去重
用HashSet集合,基于哈希表的
4.如果相对集合中的元素去重,而且保证存取顺序
用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet
5.如果想对集合元素进行排序
用TreeSet集合,基于红黑树 后续也可以用List集合实现排序
标签:Set,系列,重复,元素,索引,哈希,集合,排序 From: https://www.cnblogs.com/longlonglong777/p/17497556.html