为了实现SortedSet接口,实现几个方法,但效率有些不尽人意,求优化
/**
 * 设定比较器
 * @param comparator
 */
public void setComparator(Comparator<? super T>comparator){
this.comparator=comparator;
}
@Override
public Comparator<? super T> comparator() {
return this.comparator;
}
@Override
public T first() {
return this.getFirst();
}
@Override
public SortedSet<T> headSet(T toElement) {
SortedSet<T>result=new FastSet<T>();
for(T t:this){
if(t==null?toElement==null:t.equals(toElement))
result.add(t);
}
return result;
}
@Override
public T last() {
return this.get(this.size()-1);
}
@Override
public SortedSet<T> subSet(T fromElement, T toElement) {
SortedSet<T>result=new FastSet<T>();
if(toElement==null?fromElement==null:toElement.equals(fromElement))
return result;
for(T t:this){
if(t==null?fromElement==null:t.equals(fromElement))
result.add(t);
if(!result.isEmpty()&&t==null?toElement==null:t.equals(toElement))
break;
}
return result;
}
@Override
public SortedSet<T> tailSet(T fromElement) {
SortedSet<T>result=new FastSet<T>();
for(T t:this){
if(t==null?fromElement==null:t.equals(fromElement))
result.add(t);
}
return result;
}

解决方案 »

  1.   

    能贴全部代码吗?
    另外,用TreeSet不好吗?
      

  2.   

    只有first()里的this.getFirst();我没贴,这个实际上就是get(0)TreeSet不支持并发,ConcurrentSkipListSet虽然支持并发但只提供比较器和自然顺序2种排序,我还需要先进先出顺序,另外需要一些额外的方法。
      

  3.   

    BlockingQueue只是接口,jdk中这个接口的实现类都不满足我的要求。
      

  4.   

    因为BlockingQueue这个接口的扩展实例比较简单,而且并发性比较好,比如JavaSE新类库中的很多同步工具都跟BlockingQueue有着异曲同工之妙,比如CyclicBarrier,CountDownLatch,那么,从你给的代码可以看出,你需要的是既有SortedSet的效果,又能在多线程环境下工作,那么建议你在BlockingQueue上组合Atomic包中的同步工具,然后使用Executors框架。要还是不行,你可以试着定制ThreadFactory,这样的代码是很容易实现的,而且不用你自己去同步代码,并发性要好于一般的synchronized或者Lock,可以一试。
      

  5.   

    性能调优的时候可以优先考虑下AtomicInteger,AtomicReference等,众所周知,Atomic包中的类性能要好于Lock,Lock要好于synchronized。而且选择Lock的时候也要仔细考虑下,比如只想写入时,CopyOnWriterArrayList的性能就要比SynchronizedList好的多,有了这些神奇的工具,在这基础之上构建并发工具是很容易的。我仔细研究过,很多开源项目的源码都是在BlockingQueue的基础上构建的,所以由我上面的建议,LZ可以试试,我也比较喜欢用这些同步工具。
      

  6.   

    SynchronizedList我没用过,我只知道CopyOnWriterArrayList的并发写性能远低于它的并发读性能,因为它每次写操作都要复制一份数组。
    BlockingQueue的实现类的确有用,但我更倾向于使用它的双端阻塞和队列功能,因为它很明显不是一个Set,一个阻塞队列也没必要实现Set接口。
    Atomic也很有用,但明显跑题了,主题里的这几个方法是用不上这个了。
      

  7.   


    ConcurrentSkipListSet也可以先进先出。
    你还需要什么额外的方法?可以继承ConcurrentSkipListSet来做。//先进先出
    ConcurrentSkipListSet<String> ccsls = new ConcurrentSkipListSet<String>(new Comparator<String> () {
    @Override
    public int compare(String arg0, String arg1) {
    return 1;
    }
    });ccsls.add("C");
    ccsls.add("A");
    ccsls.add("D");
    ccsls.add("B");
    System.out.println(ccsls);