在一个线程中ConcurrentSkipListSet和TreeSet之间有什么区别

时间:2014-01-08 09:16:54

标签: java collections set

我写UT如下。为什么大小因同一比较而不同

public void testComparatorRandom2() {
    Random random = new Random();
    class CCC implements Comparator<EventLoad>{
        @Override
            public int compare(EventLoad o1, EventLoad o2) {

        if (o1.getEventId() == o2.getEventId())
            return 0;

        if (o1.getLoad() > o2.getLoad())
            return -1;
        if (o1.getLoad() < o2.getLoad())
            return 1;
        if (o1.getEventId() > o2.getEventId())
            return 1;
        if (o1.getEventId() < o2.getEventId())
            return -1;

        throw new RuntimeException("error");
        }
    }

    Set<EventLoad> eventSet = new TreeSet<EventLoad>(new CCC());
    SortedSet<EventLoad> sortedEventLoads = new ConcurrentSkipListSet<EventLoad>(new CCC());
    for (int i = 0; i < 10000; i++) {
        EventLoad newEventLoad =  new EventLoad(random.nextInt(RANDOM_NUM), random.nextInt(RANDOM_NUM)) ;
        newEventLoad.setLoad(random.nextInt(RANDOM_NUM));
        eventSet.add(newEventLoad);
        sortedEventLoads.add(newEventLoad);
        System.out.println(eventSet.size()+"=== "+newEventLoad+"======="+sortedEventLoads.size());
        if (eventSet.size() != sortedEventLoads.size())    {
            System.out.println(eventSet.size()+"=== "+eventSet+"======="+sortedEventLoads.size() +"====="+sortedEventLoads);
            //Failed
        }
    }

    AssertResult(sortedEventLoads, eventSet);
}

我的等于方法如下。那是对的吗? Eventid是EventLoad的一个属性。

    public boolean equals(Object object) {

    if (this == object)
        return true;

    if (!getClass().isInstance(object))
        return false;

    EventLoad other = (EventLoad) object;
    return _eventId == other._eventId;
}

顺便说一句。在添加之前,我可以使用contains,并且行为仍然不同。

2 个答案:

答案 0 :(得分:0)

你的比较器完全坏了,因此所有有序集的行为都是未定义的。

(如果你要求它对a,b和b进行排序,那么在说出之前的内容是不一致的。)

答案 1 :(得分:0)

根据目前的研究,我们发现比较是不正确的,因为它不遵循A&gt; B&amp;&amp; B> C然后A> C. e.g:

A Load 8, Event 10.
B Load 2, Event 8
C Load 1, Event 10;

A>B true;
B>C true;
A>C false 
A=C;

这就是为什么失败了。