JDK 1.0 class 不推荐

Stack 类定义

java.util 包下的 Stack<E> 类继承自 Vector<E> 类,是一种LIFO(后进先出)的数据结构。

  • 下面的表格是 Stack<E> 类定义的方法: | Method | Description | Remark | | —- | —- | —- | | push | E push(E element)
    入栈:把元素压入堆栈顶部。 | 与 Vector.addElement(E item) 等价 | | pop | synchronized E pop( )
    出栈:返回栈顶的元素并移除。 | 栈为空时会抛异常:
    EmptyStackException | | peek | synchronized E peek( )
    查看:返回栈顶的元素,但不移除。 | 栈为空时会抛异常:
    EmptyStackException | | empty | boolean empty()
    判断栈是否为空。 | | | search | synchronized int search(E element)
    返回元素在栈中的位置,以 1 为基数。 | |

为什么不推荐使用Stack类

参考地址:https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

  因为 Stack 是 JDK 1.0 的产物。它继承自 Vector,Vector 都不被推荐使用了,你说 Stack 还会被推荐吗?
  当初 JDK1.0 在开发时,可能为了快速的推出一些基本的数据结构操作,所以推出了一些比较粗糙的类。比如,Vector、Stack、Hashtable等。这些类中的一些方法加上了 synchronized 关键字,容易给一些初级程序员在使用上造成一些误解!而且在之前的几个版本中,性能还不怎么好。
  基于 Vector 实现的栈 Stack,底层实际上还是数组,所以还是存在需要扩容。Vector 是由数组实现的集合类,它包含了大量集合处理的方法。而 Stack 之所以继承 Vector,是为了复用 Vector 中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是 Stack 设计不好的地方,既然只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承 Vector,Stack 和 Vector 本来是毫无关系的。这使得 Stack 在基于数组实现上效率受影响,另外因为继承 Vector 类,Stack 可以复用 Vector 大量方法,这使得 Stack 在设计上不严谨。
  Java 提供了 Deuqe。Deque 是继承自 Queue,而 Stack 是继承自 Vector。Java 中的 Deuqe,即“double ended queue”的缩写,是 Java 中的双端队列集合类型。Deque 具备普通队列 FIFO 的功能,同时它也具备了 Stack 的 LIFO 功能,并且保留了 push 和 pop 函数,所以使用起来应该是一点障碍都没有。
  ArrayDeque 是 Deque 接口的一种具体实现,是依赖于可变数组来实现的。ArrayDeque 没有容量限制,可根据需求自动进行扩容。ArrayDeque 可以作为栈来使用,效率要高于 Stack。ArrayDeque 也可以作为队列来使用,效率相较于基于双向链表的 LinkedList 也要更好一些。注意,ArrayDeque 不支持为 null 的元素。

摘录文章:为什么 java.util.Stack 不被官方所推荐使用! 其他文章:Java 程序员,别用 Stack?!