栈(Stack)
栈是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。栈的两端分别为栈顶和栈底。
概念
- 入栈
又称作进栈(压栈)。向一个栈插入新元素,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素。
- 出栈
又称作退栈。从一个栈删除元素,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
特点
先进后出(LIFO)
方法
- E push(E item)
把item压入栈顶部
- E pop()
移除堆栈顶部的对象,并返回该对象。
- E peek()
查看栈顶部的对象,但不从栈中移除它。
- boolean empty()
栈是否为空
Deque<Integer> stack = new ArrayDeque<Integer>();
// 压栈
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(4);
stack.push(5);
// 遍历
Iterator<Integer> iterator=stack.iterator();
while(iterator.hasNext()) {
System.out.println("--->"+iterator.next());
}
// 出栈
Integer top=stack.pop();
System.out.println("---出栈-->"+top);
// 查看栈顶部的对象
Integer peekTop=stack.peek();
System.out.println("---栈顶-->"+peekTop);
队列
队列是一种操作受限制的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素。
特点
先进先出(FIFO)
方法
插入方法
- add(e)
添加一个元素。如果队列已满,则抛出一个IIIegaISlabEepeplian异常。该方法是非阻塞的。
- offer(e)
添加一个元素并返回true。如果队列已满,则返回false。该方法是非阻塞的。
移除方法
- remove()
移除并返回队列头部的元素。如果队列为空,则抛出一个NoSuchElementException异常。该方法是非阻塞的。
- poll()
移除并返问队列头部的元素。如果队列为空,则返回null。
检查方法
- element()
返回但不移除队列的头。如果队列为空,element()抛出异常。
- peek()
返回但不移除队列的头。如果队列为空,peek()返回null。
队列类型
概念
阻塞队列
- 入列时,如果元素数量超过队列总数,会进行等待(阻塞),待队列的中的元素出列后,元素数量未超过队列总数时,就会解除阻塞状态,进而可以继续入列;
- 出列时,如果队列为空的情况下,也会进行等待(阻塞),待队列有值的时候即会解除阻塞状态,进而继续出列;
- 阻塞队列,都是线程安全的;
- 好处是可以防止队列容器溢出;只要满了就会进行阻塞等待;也就不存在溢出的情况;
非阻塞队列
- 入列时,如果元素数量超过队列总数,则会抛出异常;出列时,如果队列为空,则取出空值;
- 不管出列还是入列,都不会进行阻塞。
有界
大小长度受限制
无界
大小长度不受限制。其实是有界限的,只不过超过界限时就会进行扩容,在内部动态扩容。
阻塞队列
DelayQueue
- 延时无界的阻塞队列
- 基于PriorityQueue
- 在该队列中,仅当元素的延迟到期时才可以使用该元素。队头是已过期时间最长的元素。
- 如果没有过期的延迟,则队列没有头部,此时调用poll将返回null。
- 往队列中插入数据的操作不会被阻塞,而获取数据的操作才会被阻塞。
LinkedBlockingQueue
- 基于链表实现的
- 有界的阻塞队列
- 创建LinkedBlockingQueue对象时如果不指定容量大小,则默认大小为Integer.MAX_VALUE。
ArrayBlockingQueue
- 基于数组实现的
- 有界阻塞队列
- 创建ArrayBlockingQueue对象时必须制定容量大小。
PriorityBlockingQueue
- 无界阻塞队列
- 按照元素的优先级对元素进行排序,按照优先级顺序出队,每次出队的元素都是优先级最高的元素。
阻塞队列方法
- take()
移除元素(从队首取元素,如果队列为空,则等待),该方法是阻塞方法。
- put(e)
添加元素(向队尾存入元素,如果队列满,则等待),该方法是阻塞方法。
非阻塞队列
- ConcurrentLinkedQueue
单向链表结构并发队列,由CAS实现线程安全。
- ConcurrentLinkedDeque
双向链表结构并发队列,由CAS实现线程安全。
- PriorityQueue
内部基于数组实现,线程不安全的队列。