Java 里有一个叫做Stack的类,却没有叫做Queue的类(它只是个接口名字,和类还不一样)。
当需要使用栈时,Java 已不推荐使用Stack,而是推荐使用更高效的ArrayDeque(双端队列),原因我们第一次讲集合框架的时候,其实已经聊过了,Stack 是一个“原始”类,它的核心方法上都加了 synchronized
关键字以确保线程安全,当我们不需要线程安全(比如说单线程环境下)性能就会比较差。
也就是说,当需要使用栈时候,请首选ArrayDeque。
在上面的示例中,我们先创建了一个 ArrayDeque 对象,然后使用 push 方法向栈中添加了三个元素。接着使用 peek 方法获取栈顶元素,使用 pop 方法弹出栈顶元素,使用 pop 和 push 方法修改栈顶元素,使用迭代器查找元素在栈中的位置。
ArrayDeque 又实现了 Deque 接口(Deque 又实现了 Queue 接口):
因此,当我们需要使用队列的时候,也可以选择 ArrayDeque。
在上面的示例中,我们先创建了一个 ArrayDeque 对象,然后使用 offer 方法向队列中添加了三个元素。接着使用 peek 方法获取队首元素,使用 poll 方法弹出队首元素,使用 poll 和 offer 方法修改队列中的元素,使用迭代器查找元素在队列中的位置。
我们前面讲了,LinkedList不只是个 List,还是一个 Queue,它也实现了 Deque 接口。
所以,当我们需要使用队列时,还可以选择LinkedList。