深入灵魂的拷问---真的了解treeSet

4 篇文章 0 订阅

今天有一个朋友突然跟我说,treeset不是有序的呀,为什么会有人说无序呀?嗯?刚听到这句话,我也一脸懵逼,什么意思,怎么情况,鲤鱼打挺我就从床上飞起来看怎么回事
然后就有了下面的内容
在翻箱倒柜的查了一些资料之后,我这边找到关于treeset的一些常规的操作
第一步:对于基本类型的排序
在这里插入图片描述
没什么疑问,就是正常的排序操作,默认的时正序排序
那这样的话,treeSet就是单纯的这么简单吗?错,我发现,如果你插入的是自定义类型的元素,那就出问题了
如果里面存储自定义类型,当存入自定义的引用类型的时候就必须考虑到元素不可重复的这个特性,不然会报Exception in thread “main” java.lang.ClassCastException: testIoc.Teacher cannot be cast to java.lang.Comparable这种错误,所以要对自定义类型进行处理,必须实现 Comparable与Compared接口,排序方式有自然排序和比较器排序。
1.自然排序
在这里插入图片描述
在这里插入图片描述
输出结果:
在这里插入图片描述

至于所谓的无序,通过之前分析的hashmap数据增加的源码,可以发现:

1、HashSet集合操作,是将数据值存入至HashMap的key中;

2、hsahmap在保存数据时,顺序是通过计算key的hash值和当前数组长度的 & 运算,计算保存数据的下标位置。所以说set是无序的。
3、由于每次保存数据,存入的是一个共同的值:
private static final Object PRESENT = new Object();
当存在key的hash与数组大小 & 计算到的值存在数组中时,则会进行新的值的覆盖,所以说set是不重复的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值