为什么Java中栈更推荐使用Deque接口?

1 Stack类

public class stack<E> extends Vector<E>可以看出该类继承Vector类,由于Vector虽然是线程安全的但是性能较差,已经过时,一般情况下使用ArrayList作为栈使用。

因为Vector是当初JAVA曾经写得不太行的类,所以Stack也不太行。

Vector不行是因为效率不太行,很多方法都用了synchronized修饰,虽然线程安全,但是像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Collections.synchronizedCollection()转化成线程安全的,所以Vector就没什么用处了

  • Deque接口及其实现提供了更完整和一致的先进先出LIFO堆栈操作集,这些接口应优先于此类。 例如:

       Deque<Integer> stack = new ArrayDeque<Integer>(); 
    
       
       
    • 1
  • 缺点:
    • 效率低
    • Vector空间满了后,扩容是一倍,而ArrayList仅仅是一半
    • Vector分配内存的时候需要连续的存储空间,如果数据太多,容易分配内存失败

2 Deque接口

​ 双端队列,支持两端元素插入和移除的线性集合。有以下常用实现类:ArrayDeque、LinkedList。

  • ArrayDeque:可调整大小的数组的实现的Deque接口。 数组deques没有容量限制; 他们根据需要增长以支持使用。 它们不是线程安全的; 在没有外部同步的情况下,它们不支持多线程的并发访问。 零元素被禁止。 当用作堆栈时,此类可能会比Stack快,并且当用作队列时速度高于LinkedList 。
    • 数组结构
    • 插入元素不能为null
    • 无法确定数据量时,后期扩容会影响效率
  • LinkedList:
    • 链表结构
    • 插入元素能为null
    • 无法确定数据量时,有更好表现

3 deque实现栈时常用的方法

入栈push(E e)
出栈poll() / pop() 后者在栈空的时候会抛出异常,前者返回null
查看栈顶peek() 为空时返回null
入队offer(E e)
出队poll() 为空时返回null
查看队首peek() 为空时返回null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值