Java语言程序设计——篇十一(4)


🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿

  • 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳🌳
    您的点赞👍、关注➕、收藏⭐️、评论📝、私信📧是我最大的支持与鼓舞!!!🌻🌻🌻

集合------Queue

Queue接口和Deque接口

Queue接口是Collection的子接口,以先进先出(First-In-First-Out,FIFO)的方式排列其元素,称为队列(queue)。

  • Queue接口的常用方法(两组):
java 复制代码
//操作失败抛出异常
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

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构造一个先进后出的栈。

java 复制代码
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转换成不同类型的集合。

java 复制代码
public ArrayList(Collection c)
public HashSet(Collection c)
public LinkedList(Collection c)

2️⃣可将Queue对象转换成一个List。

java 复制代码
Queue<String> queue = new LinkedList<>();
     queue.add("hello");
     queue.add("world");//hello,world
     List<String> myList = new ArrayList<>(queue);

3️⃣可将List对象转换成Set对象。

java 复制代码
 Set<String> set = new HashSet<>(myList);//world,hello

综合实例

我们可以将Queue的示例复杂化一些,通过引入更多的功能和逻辑来展示Queue在实际应用中的潜力。该示例模拟了一个简单的银行客户队列系统,其中包括多个窗口(虽然在这个示例中我们主要关注一个队列),客户入队、出队以及查询队列状态等功能。

java 复制代码
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方法中,我们模拟了客户的入队和出队过程,并展示了队列状态的变化。
博主用心写,读者点关注,互动传真情,知识不迷路。

相关推荐
晴子呀几秒前
Spring底层原理大致脉络
java·后端·spring
DreamByte2 分钟前
Python Tkinter小程序
开发语言·python·小程序
只吹45°风7 分钟前
Java-ArrayList和LinkedList区别
java·arraylist·linkedlist·区别
覆水难收呀10 分钟前
三、(JS)JS中常见的表单事件
开发语言·前端·javascript
阿华的代码王国14 分钟前
【JavaEE】多线程编程引入——认识Thread类
java·开发语言·数据结构·mysql·java-ee
黑蛋同志15 分钟前
array和linked list的区别
java
繁依Fanyi20 分钟前
828 华为云征文|华为 Flexus 云服务器部署 RustDesk Server,打造自己的远程桌面服务器
运维·服务器·开发语言·人工智能·pytorch·华为·华为云
andrew_121921 分钟前
腾讯 IEG 游戏前沿技术 一面复盘
java·redis·sql·面试
寻求出路的程序媛28 分钟前
JVM —— 类加载器的分类,双亲委派机制
java·jvm·面试
这孩子叫逆30 分钟前
35. MyBatis中的缓存失效机制是如何工作的?
java·spring·mybatis