Java拾贝第十六天——集合之Queue、Stack

发布时间 2023-11-04 17:38:21作者: ocraft

Queue(队列)

Queue是一种先进先出(FIFO:First In First Out)的有序集合:
image
Queue是Collection的子接口,其定义如下

public interface Queue<E> extends Collection<E>

LinkedList实现了Queue的子接口,根据多态性可以使用Queue创建LinkedList实例。

Queue接口常用方法如下:

方法 类型 描述
boolean offer(E e) 普通方法 添加元素到队尾
E poll() 普通方法 获取队首的元素并删除
E peek() 普通方法 获取队首的元素但不删除

boolean offer(E e)

添加元素到队尾

栗子:

    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        queue.offer("蛮子");
        queue.offer(null);
        queue.offer("喀什炒面");

        Iterator<String> iterator = queue.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

程序运行结果:

蛮子
null
喀什炒面

注意,null是可以作为元素添加到集合中的。但我们要避免添加null进入集合。

E poll() 和 E peek()

获取队首元素并删除 和 获取队首元素但不删除

栗子:

    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        queue.offer("蛮子");
        queue.offer(null);
        queue.offer("喀什炒面");

        System.out.println(queue.poll());//获取队首元素并删除 再打印看看
        System.out.println(queue.peek());//获取队首元素但不删除 再打印看看

        System.out.println("迭代队列============");
        Iterator<String> iterator = queue.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

程序运行结果:

蛮子
null
迭代队列============
null
喀什炒面

Stack(栈)

Stack是一种先进后出(LIFO:Last In First Out)的有序集合:
image

Stack类定义如下:

public class Stack<E> extends Vector<E>

不是接口,可以直接实例化使用。

Stack类常用方法如下:

方法 类型 描述
public E push(E item) 普通方法 将一个元素入栈
public synchronized E pop() 同步方法 取出栈顶元素并删除
public synchronized E peek() 同步方法 取出栈顶元素但不删除

public synchronized E pop()

取出栈顶元素并删除
栗子:

    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();

        stack.push("干脆面");
        stack.push("咖啡");
        stack.push("牙膏");
        stack.push("卡牌");
        stack.push("雨伞");
        stack.push("剪刀");
        stack.push("卷纸");

        Thread t1 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 4; i++) {
                    System.out.println(Thread.currentThread().getName() + stack.pop());
                }
            }
        };

        Thread t2 = new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 4; i++) {
                    System.out.println(Thread.currentThread().getName() + stack.pop());
                }
            }
        };

        t1.start();
        t2.start();
    }

程序运行结果:

Thread-1卷纸
Thread-0剪刀
Thread-1雨伞
Thread-0卡牌
Thread-1牙膏
Thread-0咖啡
Thread-1干脆面
Exception in thread "Thread-0" java.util.EmptyStackException
	at java.util.Stack.peek(Stack.java:102)
	at java.util.Stack.pop(Stack.java:84)
	at moudle2.Test16$1.run(Test16.java:22)

从结果可以看出,同步方法保证了pop()独立性。并且栈空再取出会出现异常。