Stack <double>的有效替代方案

时间:2016-06-02 09:09:09

标签: java generics stack primitive

我在Java中编写一个性能关键的方法,它使用一堆double值来存储点的(x,y)坐标。目前,我正在使用Stack<Double>,但我意识到由于自动装箱的成本,这可能会导致一些性能问题。坐标通常在调用之间发生变化,这就是缓存Double包装器无效的原因。

因此,我正在寻找一个假设的类,我们称之为DoubleStack,其行为和界面类似于Stack<T>,但仅对基元进行操作。是否有一个经常使用的类具有这样的行为,或者更好的是,一个由原色组成的库 - 存储流行容器的替代品,包括列表,堆栈和队列?

2 个答案:

答案 0 :(得分:0)

我同意关于过早优化的评论,但仅仅是为了它的乐趣,这里是一个简单的DoubleStack实现:

public class HeresYourDoubleStack {
  private int size = 0;
  private double[] values= new double[16];

  public int size() {
    return size;
  }

  public double pop() {
    if(size==0)throw new NoSuchElementException();
    return values[size--];
  }

  public void push(double value) {
    resizeIfNecessary();
    values[size++]=value;
  }

  private void resizeIfNecessary() {
    if(values.length==size){
      double[] tmp = new double[size * 2];
      System.arraycopy(values,0,tmp,0,size);
      values=tmp;
    }
  }
}

未经过测试,绝对不是线程安全的。

答案 1 :(得分:0)

有几个库为基本类型提供数据结构。 一个例子是FastUtil,它提供了一个类DoubleStack,它完全符合您的要求。 替代方案可能是Trove4J,它提供了一个类TDoubleStack,并且可能还有其他库,但提到的两个我已经合作过。

Trove4J很长一段时间都是一种标准,但似乎不再获得许多更新,而FastUtil似乎更积极地开发。此外,在我的一些(有偏见的?)测试中,FastUtil在许多情况下都更快,尽管我主要测试地图而不是Stacks。