https://www.cnblogs.com/zhou-ning/articles/13430532.html
https://www.cnblogs.com/chenglc/p/10722304.html
https://www.cnblogs.com/zhangyinhua/p/7688722.html#_label3
https://blog.csdn.net/dxy1065/article/details/78155038
刷力扣时,答案写法多,容易混淆,所以规范一下栈和队列的写法
栈
Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类
Deque<E> stack=new ArrayDeque<E>();
常用方法:
void push(E e) 栈顶添加一个元素
E pop( ) 移除栈顶元素,并返回,如果栈顶没有元素将抛出异常
E peek() 获取第一个元素,如果返回null
boolean isEmpty() 判断队列是否为空
不提倡使用vector---Stack是Vector的子类
1)Vector实现线程安全的方法,是在每个操作方法上加锁,这些锁并不是必须要的,在实际开发中,一般都是通过锁一系列的操作来实现线程安全,也就是说将需要同步的资源放一起加锁来保证线程安全。
2)如果多个Thread并发执行一个已经加锁的方法,但是在该方法中,又有Vector的存在,vector本身实现中已经加锁了,那么相当于锁上又加锁,会造成额外的开销,
3)就如上面第三个问题所说的,Vector还有fail-fast的问题,也就是说它也无法保证遍历安全,在遍历时又得额外加锁,又是额外的开销,还不如直接用arrayList,然后再加锁。
总结:Vector在你不需要进行线程安全的时候,也会给你加锁,也就导致了额外开销,所以在jdk1.5之后就被弃用了,现在如果要用到线程安全的集合,都是从java.util.concurrent包下去拿相应的类。
队列
Queue
Queue接口是单向队列
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
Queue<E> queue=new LinkedList<>(); //一般队列
Queue的主要方法如下:
boolean add(Object element) //向队的末尾添加元素,如果队列已满,会抛出异常
boolean offer(Object element) //相队的末尾添加元素,如果队列已满,返回false,推荐使用
Object remove() //删除并返回队列头部的元素,如果队列为空抛出异常
Object poll() //删除并返回队列头部的元素,如果队列为空返回null,推荐使用
Object element() //返回队列头部的元素,如果队列为空抛出异常
Object peek() //返回队列头部的元素,如果队列为空返回null,推荐使用
这些方法中的每一种都以两种形式存在:
一种在操作失败时引发异常,另一种返回一个特殊值(根据操作而为null或false)。
插入操作的后一种形式是专为与容量受限的Queue实现一起使用而设计的;在大多数实现中,插入操作不会失败。
双向队列Deque
Queue接口,有一个子接口Deque,表示双向队列;
双向队列的特点是在队列的头部和尾部都可以添加或删除元素;
它可以使用new ArrayDeque<>()来初始化,也可使用new LinkedList<>()来初始化。
Deque<E> queue=new LinkedList<>();//双向队列
主要方法:
//向队列的头部或者尾部添加元素,如果队列已满会抛出异常
void addFirst(Object element)
void addLast(Object element)
//向队列的头部或者尾部添加元素,如果队列已满返回false
boolean offerFirst(Object element)
boolean offerLast(Object element)
//从头部或尾部删除元素,如果队列为空抛出异常
Object removeFirst()
Object removeLast()
//从头部或尾部删除元素,如果队列为空返回nul
Object pollFirst()
Object pollLast()
//从队列头部或者尾部获取元素,如果队列为空抛出异常
Object getFirst()
Object getLast()
//从队列头部或者尾部获取元素,如果队列为空返回null
Object peekFirst()
Object peekLast()
优先级队列PriorityQueue
实现大顶堆和小顶堆(默认)
优先级队列会按照排序的方式 对队列中的元素进行排序和检索。
大顶堆:poll出来的是heap中最大的
大顶堆:poll出来的是heap中最小的
因此加入到PriorityQueue中的对象必须实现Comparable接口,提供对元素排序时两个元素之间的比较规则。
Queue<Integer> heap=new PriorityQueue<>(); //默认小顶堆
Queue<Integer> heap=new PriotityQueue<>((v1,v2)->v2-v1);//小顶堆(lambda表达式)
方法与一般的Queue队列差不多