Java队列数据结构的完整指南

33 阅读4分钟

Java队列是一种数据结构,我们可以在队列的末尾插入一个元素,并从队列的开头删除它。它遵循FIFO(先进先出)的原则。

我们去ATM机上取钱,在那里我们使用这个队列的概念(如果有一群人)。我们必须保持一个队列,这个队列不过是一个队列。站在队列第一个的人得到第一个服务,站在队列最后的人得到最后的服务。

Java Queue Interface Tutorial With Example

Java队列

Java Queue接口java.util包中可用,它扩展了一个Collection接口。队列集合保存着即将被处理的元素,并提供各种操作,如插入、移除等。

队列是一个有序的对象列表,其用途仅限于在列表的末尾插入元素和从开始删除项目。

队列是一个接口,所以我们需要具体的类来声明;在这种情况下,最常见的具体类是LinkedList和PriorityQueue。

我们创建一个LinkedList和PriorityQueue的实例,并将其分配给Queue,如下面的语法:

Queue q = new LinkedList ();
Queue q = new PriorityQueue ();

队列的特征

队列用于在队列的末尾添加元素和从队列的开头删除元素。它遵循FIFO的概念(先进先出):

  1. Java队列支持集合接口的所有方法,包括插入、删除等。
  2. LinkedList、ArrayBlockingQueue和PriorityQueue是最经常使用的实现方式。
  3. 如果对BlockingQueue进行任何空操作,就会抛出NullPointerException。
  4. BlockingQueues有一个线程安全的实现。
  5. 这些队列可在java.util包中找到,即无界队列。
  6. java.util.concurrent包中的队列是Bounded Queue。
  7. 除了Deques之外,所有的队列都支持在队列的尾部和头部分别插入和删除。Deque支持在两端的项目插入和移除。

队列接口的方法

java中的队列接口有多种方法,我们可以通过这些方法来实现队列数据结构。

boolean add()

它用于在队列的末端插入任何特定的元素。由于它的返回类型是布尔值,如果元素被成功地添加到队列中,它将返回真,如果没有添加到队列中,则返回假。当队列超过其最大容量时就会发生这种情况。

// Add.java

import java.util.LinkedList;
import java.util.Queue;
class Add
{
	public static void main(String []er)
	{
		//creating instance of LinkedList to decalre methods of Queue
		Queue<String>q=new LinkedList<String>();
		
		//adding elements into queue 
		
		q.add("AI");
		q.add("Java");
		//also used to add element
		q.offer("Machine Learning");
		q.add("App Development");
		System.out.println("Elements in Queues are:"+q);
		
	}
}

请看输出:

boolean add()

boolean offer()

// Add.java

import java.util.LinkedList;
import java.util.Queue;
class Add
{
	public static void main(String []er)
	{
		//creating instance of LinkedList to decalre methods of Queue
		Queue<String>q=new LinkedList<String>();
		
		//adding elements into queue 
		
		q.add("AI");
		q.add("Java");
		//also used to add element
		q.offer("Machine Learning");
		q.add("App Development");
		System.out.println("Elements in Queues are:"+q);
		
	}
}

它也将指定的元素添加到队列中。它执行的工作与add()方法相同。输出与前面的程序相同:

boolean add()

Object remove()

它检索或删除队列的头部(第一个元素)并返回其值:

// Remove.java

//importing queue and linkedlist 
import java.util.LinkedList;
import java.util.Queue;
class Remove
{
	public static void main(String []er)
	{
		//creating instance of LinkedList to decalre methods of Queue
		Queue<String>q=new LinkedList<String>();
		
		//adding elements into queue 
		
		q.add("AI");
		q.add("Java");
		//also used to add element
		q.offer("Machine Learning");
		q.add("App Development");
		System.out.println("Elements in Queues are before using remove method:"+q);
		//remove the head element of the queue 
		
		q.remove();
		
		System.out.println("Elements in Queues are after using remove method:"+q);
		
		//removing element using poll method
		q.poll();
		
		System.out.println("Elements in Queues are after using poll method:"+q);
	}
}

参见输出:

Object remove() example

Object peek()

peek()方法返回队列的头部,请看下面的程序:

// Peek.java

//importing queue and linkedlist 
import java.util.LinkedList;
import java.util.Queue;
class Peek
{
	public static void main(String []er)
	{
		//creating instance of LinkedList to decalre methods of Queue
		Queue<String>q=new LinkedList<String>();
		
		//adding elements into queue 
		
		q.add("AI");
		q.add("Java");
		//also used to add element
		q.offer("Machine Learning");
		q.add("App Development");
		System.out.println("Elements in Queues are:"+q);
		//using peek method
		System.out.println("The head element of queue is (using peek () method) :"+q.peek());
		
		//using element() method
		System.out.println("The head element of queue is (using element() method):"+q.element());
		
	}
}

请看输出:

Object Peek() example

对象 element()

element()方法也返回队列的头部。但是element()方法和peek()方法的区别在于,如果队列是空的,则返回null。

请看下面的程序:

// Peek.java

//importing queue and linkedlist 
import java.util.LinkedList;
import java.util.Queue;
class Peek
{
	public static void main(String []er)
	{
		//creating instance of LinkedList to decalre methods of Queue
		Queue<String>q=new LinkedList<String>();
		
		//adding elements into queue 
		
		q.add("AI");
		q.add("Java");
		//also used to add element
		q.offer("Machine Learning");
		q.add("App Development");
		System.out.println("Elements in Queues are:"+q);
		//using peek method
		System.out.println("The head element of queue is (using peek () method) :"+q.peek());
		
		//using element() method
		System.out.println("The head element of queue is (using element() method):"+q.element());
		
	}
}

输出

Object Peek() example

对象 poll()

poll()方法与remove()方法类似,但唯一的区别是poll()在队列为空时返回null:

// Remove.java

//importing queue and linkedlist 
import java.util.LinkedList;
import java.util.Queue;
class Remove
{
	public static void main(String []er)
	{
		//creating instance of LinkedList to decalre methods of Queue
		Queue<String>q=new LinkedList<String>();
		
		//adding elements into queue 
		
		q.add("AI");
		q.add("Java");
		//also used to add element
		q.offer("Machine Learning");
		q.add("App Development");
		System.out.println("Elements in Queues are before using remove method:"+q);
		//remove the head element of the queue 
		
		q.remove();
		
		System.out.println("Elements in Queues are after using remove method:"+q);
		
		//removing element using poll method
		q.poll();
		
		System.out.println("Elements in Queues are after using poll method:"+q);
	}
}

输出对象

Object poll() example

size()

size()方法返回队列中元素的数量。由于它是集合类的一个子类型,它继承了集合类的所有方法,即size()、 isEmpty()、 contains()等。

本教程就讲到这里。