Java集合框架
Java集合框架
Queue
Queue接口是Java集合框架中定义的一个接口,它代表了一个先进先出(FIFO)的队列。Queue接口继承自Collection接口,它定义了一组方法来操作队列中的元素。下面是Queue接口的一些主要方法和特性的详细解释:
添加元素
boolean add(E element)
: 将指定的元素添加到队列的末尾,如果成功则返回true,如果队列已满则抛出异常。boolean offer(E element)
: 将指定的元素添加到队列的末尾,如果成功则返回true,如果队列已满则返回false。
移除元素
E remove()
: 移除并返回队列头部的元素,如果队列为空则抛出异常。E poll()
: 移除并返回队列头部的元素,如果队列为空则返回null。
获取头部元素
E element()
: 获取队列头部的元素,但不移除它,如果队列为空则抛出异常。E peek()
:获取队列头部的元素,但不移除它,如果队列为空则返回null。
Queue接口还有一些其他方法,如clear()
用于清空队列中的所有元素,contains(Object o)
用于判断队列是否包含指定元素等。
Deque
Deque接口是Java集合框架中定义的一个接口,它代表了一个双端队列(Double Ended Queue)。Deque是”双端队列”的缩写。Deque接口继承自Queue接口,并在其基础上提供了在队列两端进行添加、删除和检索元素的操作。Deque可以在队列的头部和尾部同时进行元素的插入和删除,因此可以作为队列、栈或双向队列使用。
添加元素
void addFirst(E element)
: 将指定元素添加到双端队列的头部。void addLast(E element)
: 将指定元素添加到双端队列的尾部。boolean offerFirst(E element)
: 将指定元素添加到双端队列的头部,如果成功则返回true,如果队列已满则返回false
。boolean offerLast(E element)
: 将指定元素添加到双端队列的尾部,如果成功则返回true,如果队列已满则返回false
。
移除元素
E removeFirst():
移除并返回双端队列的头部元素,如果队列为空则抛出异常。E removeLast()
: 移除并返回双端队列的尾部元素,如果队列为空则抛出异常。E pollFirst()
: 移除并返回双端队列的头部元素,如果队列为空则返回null
。E pollLast()
: 移除并返回双端队列的尾部元素,如果队列为空则返回null
。
获取头部和尾部元素
E getFirst()
: 获取双端队列的头部元素,但不移除它,如果队列为空则抛出异常E getLast()
: 获取双端队列的尾部元素,但不移除它,如果队列为空则抛出异常。E peekFirst()
: 获取双端队列的头部元素,但不移除它,如果队列为空则返回null
。E peekLast()
: 获取双端队列的尾部元素,但不移除它,如果队列为空则返回null
。
另外,需要注意的是,Deque接口还可以用作栈(LIFO)的数据结构。通过在队列头部执行插入和删除操作,可以实现栈的功能。常见的栈操作可以使用Deque接口中的以下方法来实现:
void push(E element)
: 将元素推入栈顶,等同于addFirst(E element)
。E pop()
: 弹出并返回栈顶元素,等同于removeFirst()
。E peek()
: 获取栈顶元素,等同于peekFirst()
。
所以,Deque接口是一个非常有用的接口,提供了双端队列的功能,既可以在队列的头部进行操作,也可以在尾部进行操作。它是Queue接口的扩展,可以方便地实现队列、栈和双向队列的功能,并提供了丰富的方法来操作和访问队列中的元素。
Set
Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类。
在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
HashSet是哈希表结构,主要利用HashMap的key来存储元素,计算插入元素的hashCode来获取元素在集合中的位置;
TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;
常用方法
1 | public interface Set<E> extends Collection<E> { |
HashSet
HashSet实现Set接口,底层由HashMap(后面讲解)来实现,为哈希表结构,新增元素相当于HashMap的key,value默认为一个固定的Object。在我看来,HashSet相当于一个阉割版的HashMap;
当有元素插入的时候,会计算元素的hashCode值,将元素插入到哈希表对应的位置中来;
特点
- 不允许出现重复因素;
- 允许插入Null值;
- 元素无序(添加顺序和遍历顺序不一致);
- 线程不安全,若2个线程同时操作HashSet,必须通过代码实现同步;
TreeSet
从名字上可以看出,此集合的实现和树结构有关。与HashSet集合类似,TreeSet也是基于Map来实现,具体实现TreeMap(后面讲解),其底层结构为红黑树(特殊的二叉查找树);
与HashSet不同的是,TreeSet具有排序功能,分为自然排序(123456)和自定义排序两类,默认是自然排序;在程序中,我们可以按照任意顺序将元素插入到集合中,等到遍历时TreeSet会按照一定顺序输出–倒序或者升序;
特点
- 对插入的元素进行排序,是一个有序的集合(主要与HashSet的区别);
- 底层使用红黑树结构,而不是哈希表结构;
- 允许插入Null值;
- 不允许插入重复元素;
- 线程不安全;
PriorityQueue
函数名 | 功能介绍 |
---|---|
boolean offer(E e) | 插入元素e,插入成功返回true,如果e对象为空,抛出NullPointerException异常 |
E peek() | 获取优先级最高的元素,如果优先级队列为空,返回null |
E poll() | 移除优先级最高的元素并返回,如果优先级队列为空,返回null |
int size() | 获取有效元素的个数 |
void clear() | 清空 |
boolean isEmpty() | 检测优先队列是否为空,空返回true |