JAVA SortedSet的坑

今天在用ConcurrentSkipListSet的时候,发现有些对象在调用add方法时,返回false。调用contains方法返回true,说明元素在set中已经存在了,但实际上没有。首先,我先查看java帮助,contains方法是这么说的:
“Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that o.equals(e).”
根据上面的说明,我尝试了下,但在此时踩到坑:

            System.out.println("check 1:"+taskset.contains(tk));

            boolean contains = false;
            for(WfTask t:taskset) {
                if(tk.equals(t)) {
                    contains = true;
                }
            }
            System.out.println("check 2:"+contains);

运行结果缺是:
check 1:true
check 2:false
结果明显和java帮助说明不一样嘛。也就是说,在set中,不只通过equals判断是否重复。
但是,将ConcurrentSkipListSet 替换成hashset,则不存在上述问题。treeset也同样存在上述问题
可见,上述问题与排序有关。
通过检查自定义的排序方法,发现添加不进去的元素,都是与set中的元素比较大小时,产生的相等的结果,即compare 接口返回0。

由此可见,对于hashset,是否重复只通过equals判断。
但对于SortedSet,如ConcurrentSkipListSet 或TreeSet,不但要通过equals判断,还要通过compare 方法判断是否与set中的元素存在相等情况,若存在相等,也不能加入。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值