🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿
- 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻
集合——Queue
- Queue接口和Deque接口
- ArrayDeque和LinkedList类
- 实战演练
- 实战演练
- 集合转换
- 综合实例
Queue接口和Deque接口
Queue接口是Collection的子接口,以先进先出(First-In-First-Out,FIFO)的方式排列其元素,称为队列(queue)。
- Queue接口的常用方法(两组):
//操作失败抛出异常
boolean add(E e)E remove()E element()
//操作失败不抛出异常boolean offer(E e)E poll()E peek()
- Deque接口实现双端队列,它支持从两端插入和删除元素,它同时实现了Stack和Queue的功能。
- 基本操作方法,如下表所示。
操作类型 | 队首元素操作 | 队尾元素操作 |
---|---|---|
插入元素 | addFirst(e) offerFirst(e) | addLast(e) offerLast(e) |
删除元素 | removeFirst() pollFirst() | removeLast() pollLast() |
返回元素 | getFirst() peekFirst() | getLast() peekLast() |
ArrayDeque和LinkedList类
- ArrayDeque类和LinkedList类是Deque的实现类,前者是可变数组的实现,后者是线性链表的实现。
- 可以使用增强的for循环和迭代器访问Deque的元素。
实战演练
例:ArrayDequeDemo.java
import java.util.*;
public class ArrayDequeDemo {
public static void main(String[] args) {
int[] elements = { 1, 2, 3, 0, 7, 8, 9 };
ArrayDeque<Integer> queue = new ArrayDeque<>();
queue.addFirst(5); // 将元素5添加到队列queue中
// 将数组中的前三个元素添加到queue
for (int i = 0; i < 3; i++)queue.addFirst(elements[i]);
// 将数组中的后三个元素添加到queue
for (int i = 4; i < 7; i++)queue.offerLast(elements[i]);
// 访问queue中的每个元素
for (Integer v : queue)System.out.print(v + " ");
System.out.println("\nsize = " + queue.size());
}
}
- 如果需要经常在线性表内添加或删除元素,使用LinkedList类实现的列表的效率较高。
- LinkedList类的构造方法
- ①public LinkedList( ):创建空的链表
- ②public LinkedList(Collection c):用集合c中的元素创建一个链表
【注意】创建LinkedList对象不需要指定初始容量 - LinkList类同时实现了List接口和Queue接口。
LinkedList类的常用方法
常用方法 | 功能说明 |
---|---|
public void addFirst(E e) | 将元素e插入到列表的开头 |
public void addLast(E e) | 将元素e添加到列表的末尾 |
public E getFirst( ) | 返回列表中的第一个元素 |
public E getLast( ) | 返回列表中的最后一个元素 |
public E removeFirst( ) | 删除并返回列表中的第一个元素 |
public E removeLast( ) | 删除并返回列表中的最后一个元素 |
实战演练
【例】利用LinkedList构造一个先进后出的栈。
import java.util.*;
class StringStack
{private LinkedList<String> ld=new LinkedList<String>();public void push(String name){ld.addFirst(name);}public String pop(){return ld.removeFirst();}public boolean isEmpty(){return ld.isEmpty();}
}
public class LinkedListDemo{public static void main(String[] args) {Scanner sc=new Scanner(System.in);StringStack stack=new StringStack();System.out.println("请输入数据(quit结束)");while(true){String input=sc.next();if(input.equals("quit"))break;stack.push(input);}System.out.println("先进后出的顺序:");while(!stack.isEmpty())System.out.print(stack.pop()+" ");}
}
集合转换
1️⃣可将Collection转换成不同类型的集合。
public ArrayList(Collection c)
public HashSet(Collection c)
public LinkedList(Collection c)
2️⃣可将Queue对象转换成一个List。
Queue<String> queue = new LinkedList<>();queue.add("hello");queue.add("world");//hello,worldList<String> myList = new ArrayList<>(queue);
3️⃣可将List对象转换成Set对象。
Set<String> set = new HashSet<>(myList);//world,hello
综合实例
我们可以将Queue的示例复杂化一些,通过引入更多的功能和逻辑来展示Queue在实际应用中的潜力。该示例模拟了一个简单的银行客户队列系统,其中包括多个窗口(虽然在这个示例中我们主要关注一个队列),客户入队、出队以及查询队列状态等功能。
import java.util.LinkedList;
import java.util.Queue; public class BankQueueSystem { private Queue<Customer> queue = new LinkedList<>(); // 假设这是银行的一个客户类 static class Customer { private String name; private int ticketNumber; // 假设这是客户的排队号 public Customer(String name, int ticketNumber) { this.name = name; this.ticketNumber = ticketNumber; } @Override public String toString() { return "Customer{" + "name='" + name + '\'' + ", ticketNumber=" + ticketNumber + '}'; } } // 客户入队 public void enqueueCustomer( customer) { synchronized (queue) { // 在实际应用中,这里可能需要更复杂的逻辑来分配ticketNumber queue.offer(customer); System.out.println(customer.name + " 加入队列,当前位置:" + customer.ticketNumber); // 注意:这里的ticketNumber只是为了示例,实际上在队列中通常不直接存储位置信息 } } // 客户出队(服务完成) public Customer dequeue() { synchronized (queue) { if (queue.isEmpty()) { System.out.println("队列为空,没有客户可以服务。"); return null; } Customer customer = queue.poll(); System.out.println(customer.name + " 离开队列,服务完成。"); return customer; } } // 显示队列状态 public void showQueueStatus() { synchronized (queue) { if (queue.isEmpty()) { System.out.println("队列为空。"); } else { System.out.println("当前队列中的客户:"); for (Customer customer : queue) { System.out.println(customer); } } } } public static void main(String[] args) { BankQueueSystem bankQueue = new BankQueueSystem(); // 模拟客户入队 bankQueue.enqueue(new Customer("Alice", 1)); bankQueue.enqueue(new Customer("Bob", 2)); bankQueue.enqueue(new Customer("Charlie", 3)); // 显示队列状态 bankQueue.showQueueStatus(); // 模拟服务过程,客户出队 bankQueue.dequeue(); bankQueue.dequeue(); // 再次显示队列状态 bankQueue.showQueueStatus(); // 尝试出队一个不存在的客户(队列为空) bankQueue.dequeue(); }
}
在这个示例中,我们创建了一个BankQueueSystem
类,它内部维护了一个Queue 来存储银行客户。我们定义了一个Customer
内部类来表示客户,包含客户的名字和一个假设的排队号(ticketNumber),但在实际队列操作中,我们通常不直接在队列元素中存储位置信息,这里只是为了示例目的。
我们为BankQueueSystem类添加了三个方法:enqueue
用于客户入队,dequeue
用于客户出队(即服务完成),showQueueStatus
用于显示当前队列的状态。在main方法中,我们模拟了客户的入队和出队过程,并展示了队列状态的变化。
博主用心写,读者点关注,互动传真情,知识不迷路。