0. Queue接口
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
LinkedList类实现了Queue接口
Queue接口中主要有以下方法
Throws exception | Returns special value | |
Insert | add(e) |
offer(e) |
Remove | remove() |
poll() |
Examine | element() |
peek() |
element和peek返回前端而不删除
可以通过继承AbstractQueue来实现Queue中大多数方法
Queue接口的使用示例
package com.hyh0.learning.collections; import java.util.LinkedList; import java.util.Queue; public class GeneralTest { public static void main(String[] args) { Queue<String> list = new LinkedList<>(); list.offer("hello"); list.offer(" "); list.offer("world"); while(list.peek() != null) { System.out.print(list.poll()); } System.out.println(); } }
1. Iterator接口
Iterator接口有三个方法
public interface Iterator<E>; { E next(); boolean hasNext(); default void remove(); }
PS: 这里的remove()使用了jdk1.8的default关键字定义了默认实现,如果不重载就使用会抛出UnsupportedOperationException异常,所以实现接口时应该重载这个方法(?)
next方法会返回下一个元素
hasNext返回是否有下一个元素
remove会删除上一次next()返回的元素(每一次使用remove前都必须调用过next方法)
用Iterator可以遍历元素
2. Iterable接口
Iterable接口有一个方法,其返回一个Iterator
public interface Iterable<E>; { Iterator<E> iterator(); }
实现了Iterable接口的对象都可以使用 for – each 循环
3. ListIterator接口
ListIterator继承自Iterator
除了Iterator中的方法,ListIterator接口中还有add方法在当前位置后添加元素
除此之外,还有previous与hasPrevious方法
使用add在原有LinkedList中间插入” “的示例
public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("hello"); list.add("world"); ListIterator<String> it = list.listIterator(); it.next(); it.add(" "); it.previous(); //添加了元素后迭代器后移 it.previous(); //所以需要后移两次 while (it.hasNext()) { System.out.print(it.next()); } System.out.println(); }
4. Deque接口
Deque接口与Queue接口类似,但不同于Queue只能在尾部添加头部读取,Deque可以选择在头部或者尾部进行操作
ArrayDeque和LinkedList实现了Deque接口