定义栈的两种方式
Java中有一个栈的方式为
Stack<Integer> stack = new Stack<>();
我一般也会使用这个,今天查看JavaAPI文档,发现官方文档中说到
用这个使用栈更推荐,话不多说,先来个小目标-“进行一亿次操作”,先用我们常用的方式试试。
Stack<Integer> stack = new Stack<>();
long l = System.currentTimeMillis();
for(long i = 0;i<(long) 1000000000;i++){
stack.push(10);
Integer pop = stack.pop();
}
long l1 = System.currentTimeMillis();
System.out.println("时间为:"+(l1-l));
时间为:17887
时间为17秒
Deque<Integer> stack1 = new ArrayDeque<>();
long l = System.currentTimeMillis();
for(long i = 0;i<(long) 1000000000;i++){
stack1.push(10);
Integer pop = stack1.pop();
}
long l1 = System.currentTimeMillis();
System.out.println("时间为:"+(l1-l));
时间为:1474
只用了1.4秒
由此可见,两者差距特别大。
下面看原因
在推荐的使用中,该pop方法是非线程安全的,但是在Stack中是线程安全的。
这里就类似于 HashTable与HashSet的区别,HashTable是线程安全的,而HashSet是非线程安全的。
以上仅个人见解,如有错误感谢指正。