说说 Java 堆栈
堆栈是“后进先出”(LIFO)集合。因为最后压入栈的元素,会被第一个 弹出栈。
就好像堆叠在一起的盘子,必须把上面的盘子取出,才能取出下面的盘子。强行取出底下的盘子就会造成结构不稳,引起坍塌。
1 基本用法
Java 使用了一个新的类 ArrayDeque 来实现堆栈结构:
输出:
2 Stack 类
为何不推荐使用 Java Stack 类?
因为 Stack 类继承了 Vector 类,也就继承了 Vector 中所有公有方法。而 Vector 作为动态数组,它提供了在数组中任何位置添加或者删除元素的方法。这种设计破坏了栈这种数据结构,因为栈只允许在一端进行操作。
我们可以自定义一个名为 Stack 的类,来替换原生 Stack 类:
3 Vector 类
为何不推荐使用 Java Vector 类?
从Vector 类的源代码中可以看出,大量 API 方法加入 synchronized 标注,在方法级别实现同步操作。虽然这样做可以保证线程安全,但牺牲了性能。因此相对于 ArrayList 来说,效率不高。
还有一个原因是 Vector 对象扩容时,默认是原容量的2倍;而 ArrayList 类扩容是原容量的 1.5 倍,所以 ArrayList 类更节省空间。