我们都知道栈有两种实现方式。
一个用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。那么每一次都要对后面的成员进行位置调整。