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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public interface Set<E> extends Collection<E> {

A:添加功能
boolean add(E e);
boolean addAll(Collection<? extends E> c);

B:删除功能
boolean remove(Object o);
boolean removeAll(Collection<?> c);
void clear();

C:长度功能
int size();

D:判断功能
boolean isEmpty();
boolean contains(Object o);
boolean containsAll(Collection<?> c);
boolean retainAll(Collection<?> c);

E:获取Set集合的迭代器:
Iterator<E> iterator();

F:把集合转换成数组
Object[] toArray();
<T> T[] toArray(T[] a);

//判断元素是否重复,为子类提高重写方法
boolean equals(Object o);
int hashCode();
}

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