堆栈的有效替代<Double>

Efficient alternative to Stack<Double>

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

因此,我正在寻找一个假设的 class,我们称之为 DoubleStack,其行为和界面类似于 Stack<T>,但仅在基元上运行。是否有一个经常使用的 class 具有这种行为,或者更好的是,一个由主要存储替代流行容器(包括列表、堆栈和队列)的库组成?

我同意关于过早优化的评论,但为了好玩,这里有一个简单的 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;
    }
  }
}

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

有几个库为基本类型提供数据结构。 一个示例是 FastUtil,它提供了一个 class DoubleStack,它完全符合您的要求。 另一种选择可能是 Trove4J,它提供 class TDoubleStack,并且可能还有其他库,但我使用过的两个库。

Trove4J 长期以来一直是一种标准,但似乎不再有太多更新,而 FastUtil 似乎得到了更积极的开发。此外,在我的一些(有偏见的?)测试中,FastUtil 在许多情况下速度更快,尽管我测试的主要是 Maps,而不是 Stacks。