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 的兜底判断,是不是相同元素;

 

posted on 2020-08-05 18:55  陈晶典  阅读(597)  评论(0编辑  收藏  举报

导航