ThreeSet 集合 元素排序
Set集合的元素 进入集合中的 条件;
set集合中的元素逐个进入集合
必须满足set集合中的元素没有重复,重复元素不得重复进集合;
所以,元素进入set集合的时候会逐个与集合中的已有元素对比;
这个逐个对比过程就完成了 对 set 集合中元素的排序过程
set集合的的两个实现类
HashSet
TreeSet
我分别剖析:
HashSet
元素进来的时候,判断是不是重复元素
依据是 哈希值 与 地址值 是不是都是一样,
如果都一样则 我就认为 我集合里面已经有重复元素了,你就不得进入;
HashSet会优先比较哈希值 ,如果哈希值不同,就不会费劲再比较地址值,如此效率提高;
依据 哈希表结构排序;
哈希表是 数组+链表+红黑树(jdk1.8)
元素在进入哈希表的时候,可能会经历 数组扩容,链表变红黑树,等等,这里有一整套完整的规则
所以我们认为HashSet元素排列是无序的,取出顺序不同于存入顺序,
严谨来说HashSet元素进入 安放位置 是有固定规则的;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
如果要按照我们的需要排序,可以使用 TreeSet
TreeSet集合底层是二叉树结构,一个树杈分开的形式,比我小的 坐左边 ,比我大的 坐右边;
元素进入集合的
依据是 compareTo方法
比如说,我要对 学生 排序, 优先按照姓名 排序 ,如果 姓名相同,那么 我就按照 年龄 排序
对于compareTo 的安排 有 2 种 安排;
I 对需要进入集合的 元素 实现 Comparable<T> 接口 重写 compareTo 方法
II 带参构造 TreeSet 集合
有时候同一个Student,在不同的应用场景中,需要不同的排序方式,应对不同的排序场景,我在 学生类 里 重写 compareTo 方法 就写死了, 不够灵活;
这个时候可以在集合的构造方法中安排compareTo 方法
如果同时Student类中实现了Comparetor接口,这里仍然以TreeSet集合的构造方式中的排序安排来执行;
这里解释一下 返回的 result>>>>>>>>>>>
返回是 0 代表 集合里已经有该元素,不得进入重复的元素
返回是正数 则 坐 位于树的右边
返回是负数 则 坐 位于数的左边
如果巧妙的设置 使 result 避免是0 值 ,那么 ThreeSet 集合 也可以这样 进入 相同的元素;
所以本意非如此,所以也特别注意避免这种 可能重复元素 进入 Set 集合的情况,一般根据元素的某个 唯一性 的属性 (例如说 id ) 作兜底, 利用 这个 元素 的唯一性 属性
作result 的兜底判断,是不是相同元素;