package com.github.ompc.greys.core.util.collection; import java.util.NoSuchElementException; import static java.lang.System.arraycopy; /** * 线程不安全不固定栈深的堆栈实现<br/> * 比默认的实现带来3倍的性能提升 * Created by oldmanpushcart@gmail.com on 15/6/21. * @param <E> */ public class ThreadUnsafeGaStack<E> implements GaStack<E> { private final static int EMPTY_INDEX = -1; private final static int DEFAULT_STACK_DEEP = 12; private Object[] elementArray; private int current = EMPTY_INDEX; public ThreadUnsafeGaStack() { this(DEFAULT_STACK_DEEP); } public ThreadUnsafeGaStack(int stackSize) { this.elementArray = new Object[stackSize]; } /** * 自动扩容<br/> * 当前堆栈最大深度不满足期望时会自动扩容(2倍扩容) * * @param expectDeep 期望堆栈深度 */ private void ensureCapacityInternal(int expectDeep) { final int currentStackSize = elementArray.length; if (elementArray.length <= expectDeep) { final Object[] newElementArray = new Object[currentStackSize * 2]; arraycopy(elementArray, 0, newElementArray, 0, currentStackSize); this.elementArray = newElementArray; } } private void checkForPopOrPeek() { // stack is empty if (isEmpty()) { throw new NoSuchElementException(); } } @Override public E pop() { checkForPopOrPeek(); //noinspection unchecked return (E) elementArray[current--]; } @Override public void push(E e) { ensureCapacityInternal(current + 1); elementArray[++current] = e; } @Override public E peek() { checkForPopOrPeek(); //noinspection unchecked return (E) elementArray[current]; } @Override public boolean isEmpty() { return current == EMPTY_INDEX; } }