数据结构专题

链表专题(待更新)

栈专题

Java中用来表达栈的功能(push/pop/peek),更适用的是使用双端队列接口Deque,并用实现类ArrayDeque/LinkedList来进行初始化。

Deque<Integer> stack = new ArrayDeque<>();
stack.addFirst(E);  // 在ArrayDeque双端队列的末尾插入指定的内容
stack.peekFirst(); 	// 返回ArrayDeque双端队列的第一个元素
stack.pollFirst();  // 返回并删除ArrayDeque双端队列的第一个元素

/*迭代遍历ArrayDeque*/
/*使用iterator(),返回可用于遍历ArrayDeque双端队列的迭代器. 
	descendingIterator()可用于以相反顺序遍历ArrayDeque双端队列*/
Iterator<String> iterate = animals.iterator();
while(iterate.hasNext()) {
	System.out.print(iterate.next());
	System.out.print(", ");
}

用ArrayDeque还是LinkedList?

ArrayDeque源码注释中有一句话:
This class is likely to be faster than {@link Stack} when used as a stack,
and faster than {@link LinkedList} when used as a queue.

ArrayDeque用作栈时比Stack快,用作队列的时候也会比LinkedList快!但是这二者差别通常可以忽略。

为什么不推荐使用Stack类?

Stack从Vector继承是个历史遗留问题,JDK官方已建议优先使用Deque的实现类来代替Stack。

原因:从性能上来说应该使用Deque代替Stack。 此外,Stack 还犯了面向对象设计的错误:将组合关系当成了继承关系。

  1. Java中Stack类从Vector类继承,底层是用数组实现的线程安全的栈,很多方法都用了synchronized修饰,因此Stack和Vector都是线程安全的。
  2. 而多数情况下并不需要做到线程安全,因此没有必要使用Stack。毕竟保证线程安全需要上锁,有额外的系统开销。
  3. 另外,像ArrayDeque,LinkedList这些线程不安全的,在需要安全的时候也可以用Collections.synchronizedCollection()转化成线程安全的,因此如果用Stack类效率不太行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值