我们都知道栈有两种实现方式。
一个用Stack类。一个用LinkedList类实现。那么它们之间有什么不同呢?
我们先用一段代码显示一下。
public static LinkedList<String> stack;
public static Stack<String> stack1;
public static LinkedList<String> list;
public static void init(){
stack1 =new Stack<>();
stack1.push("1");
stack1.push("2");
stack1.push("3");
stack1.push("4");
stack=new LinkedList<>();
stack.push("1");
stack.push("2");
stack.push("3");
stack.push("4");
list=new LinkedList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
System.out.println(stack1);
System.out.println(stack);
System.out.println(list);
}
输出结果为:
[1, 2, 3, 4]
[4, 3, 2, 1]
[1, 2, 3, 4]
可以发现Stack实现、与LinkedList实现的输出是不一样的。顺序刚好是相反的。
其实我们通过源码分析:
Stack类实现时,push和pop。都是对数组最高下标成员进行操作。从而实现后进先出(LIFO)。


但是,LinkedList进行push和pop操作时,是通过对链表first节点进行操作的,得到LIFO的效果。



用一个图来表示就是:
Stack中存储形式为:
| 1 | 2 | 3 | 4 |
q:栈底 p:栈顶
LinkedList中存储形式为:

为什么会有这样的差异呢?
其实主要还是因为Stack是用数组实现的。而LinkedList用链表实现的。
可以想想一下,如果Stack在elementData[0]进行push和pop。那么每一次都要对后面的成员进行位置调整。
本文探讨了使用Stack类和LinkedList类实现栈的不同之处。通过示例代码展示两种实现方式的输出结果,并从源码层面解析了这两种实现方式的具体工作原理及内部结构差异。
3114





