JDK中和栈、队列相关的类
JDK中提供了若干和栈、队列相关的类或接口,主要有如下几个
- List,JDK自带的线性表接口,Java中几乎所有的线性表结构,都实现了List接口
- Vector,Vector相当于一个线程安全的ArrayList,在它的基础上,控制元素的插入删除位置,就能实现栈和队列的功能
- Stack,继承自Vector,是JDK自带的栈类型
- Queue,JDK自带的队列类型,但只是一个接口
- Deque,JDK自带的双向队列类型,也是一个接口,双向队列本身的结构决定了,它既能当栈使用,也能当队列使用
- LinkedList,Deque双向队列实现类。这是一个非常强大的类,它既能当双向链表用,又能当双向队列用,还能当作栈来用,JDK建议使用LinkedList作为栈,而不是Stack类
由于LinkedList的功能特别强大,同时实现了很多接口,所以它的方法特别多
其中很多方法,功能有相似之处,但细节上有区别,所以有必要逐个理清
LinkedList API 详解
作为Collection使用时,它的方法有
- boolean add(E e),向集合中添加一个新元素,成功则返回true。当Collection不允许插入空元素时,强行插入抛出非法参数异常。当Collection容量已满时,强行插入抛出非法状态异常。当Collection不允许插入重复元素时,强行插入返回false
- boolean remove(Object o),移除首个相同的元素,有匹配元素被移除返回true,否则返回false。当Collection不允许空元素时,强行传入null抛出空指针异常
作为List使用时,它的方法有
- E remove(int index),移除指定位置的元素,存在则返回被删除的元素,否则抛出下标越界异常
- E get(int index),获取指定位置的元素,存在则返回该元素,否则抛出下标越界异常
- E set(int index, E element),替换指定位置的元素,存在则返回被替换的元素,否则抛出下标越界异常
作为Queue使用时,它的方法有
- boolean add(E e),向队尾添加元素,如果队列已满,抛出非法状态异常
- boolean offer(E e),向队尾添加元素,如果队列已满,则返回false
- E remove(),移除队首元素,返回被移除的元素,如果队列为空,则抛出元素不存在异常
- E poll(),移除队首元素,返回被移除的元素,如果队列为空,则返回null
- E element(),获取队首元素,如果队列为空,则抛出元素不存在异常
- E peek(),获取队首元素,如果队列为空,则返回null
由于Deque同时具备双向队列+双向栈+双向链表的功能,所以我们将其接口分为几部分来讲解
作为Stack(Deque)使用时,它的方法有
- void push(E e),向栈顶添加元素
- E pop(),移除栈顶元素,返回被移除的元素,如果栈为空,则返回null
作为双向链表(Deque)使用时,它的方法有
- void addFirst(E e),向链表头部添加元素,不允许添加时抛出异常
- void addLast(E e),向链表尾部添加元素,不允许添加时抛出异常
- boolean offerFirst(E e),向链表头部添加元素,不允许添加时返回false
- boolean offerLast(E e),向链表尾部添加元素,不允许添加时返回false
- E removeFirst(),删除链表头部元素,返回移除元素,链表为空时抛出异常
- E removeLast(),删除链表尾部元素,返回移除元素,链表为空时抛出异常
- E pollFirst(),删除链表头部元素,返回移除元素,链表为空时返回null
- E pollLast(),删除链表尾部元素,返回移除元素,链表为空时返回null
- E getFirst(),获取链表头部元素,链表为空时抛出异常
- E getLast(),获取链表尾部元素,链表为空时抛出异常
- E peekFirst(),获取链表头部元素,链表为空时返回null
- E peekLast(),获取链表尾部元素,链表为空时返回null
这下大家应该明白了,为什么LinkedList会有那么多方法了吧
因为它实现了多个接口,同时扮演了多个角色
我们只需要理解每个方法属于哪个接口,每个接口有哪些功能,问题就自然迎刃而解了
LinkedList几乎包含了所有线性表的功能,如果想简单阅读下List源码,这个是最好的参考对象