java.util.Queue用法

本文详细介绍了Java中队列数据结构的概念及其操作方法,包括如何使用java.util.Queue接口及LinkedList实现队列,展示了队列的基本操作如插入、删除等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。

在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。

Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
element()或者peek()方法。

值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

package com.lxc.test;

import java.util.LinkedList;
import java.util.Queue;

public class QueueTest {
    public static void main(String[] args) {
        //add()和remove()方法在失败的时候会抛出异常(不推荐)
        Queue<String> queue = new LinkedList<String>();
        //添加元素
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        queue.offer("e");
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("element="+queue.element()); //返回第一个元素 
        for(String q : queue){
            System.out.println(q);
        }
        System.out.println("===");
        System.out.println("peek="+queue.peek()); //返回第一个元素 
        for(String q : queue){
            System.out.println(q);
        }
        
    }
}

 

转载于:https://www.cnblogs.com/lxcmyf/p/8477421.html

### 关于 Java 中泛型数组初始化的警告问题 在 Java 中,由于类型擦除机制的存在,在运行时无法知道具体的泛型类型 `T` 的实际类型。因此,直接尝试创建泛型数组会引发编译器发出 **unchecked assignment** 警告。 可以通过以下方法来消除这种警告: #### 方法一:使用反射创建数组并抑制警告 通过 `java.lang.reflect.Array` 提供的功能可以动态地创建指定类型的数组实例。这种方法利用了类对象作为参数传递给方法,从而绕过编译期检查。以下是具体实现方式[^1]: ```java @SuppressWarnings("unchecked") public static <T> T[] createGenericArray(Class<T> clazz, int size) { return (T[]) java.lang.reflect.Array.newInstance(clazz, size); } ``` 上述代码中,`@SuppressWarnings("unchecked")` 注解用于告诉编译器忽略此位置可能出现的未检查转换警告。需要注意的是,虽然这种方式消除了警告,但在某些情况下仍可能存在潜在风险,需谨慎处理。 #### 方法二:借助 Object 数组再强制转型 另一种常见做法是先声明一个普通的 `Object[]` 数组,随后将其强转为目标泛型类型数组。不过该方案同样会产生 unchecked warning,故也需要配合 SuppressWarnings 使用: ```java @SuppressWarnings("unchecked") public static <T> T[] createAnotherWay(int length){ Object[] temp = new Object[length]; return (T[])temp; } ``` 尽管如此操作简单易懂,但由于缺乏对目标组件的确切定义(即缺少 Class 参数),所以相较前一种更为局限且不够安全。 另外值得注意的一点是从 JDK 设计角度来看,之所以不允许轻易构建真正的泛型数组是因为要维护 JVM 层面统一性和兼容性考虑;而像 ArrayBlockingQueue 这样的集合容器,则采用内部封装好的固定长度数据结构——如普通对象数组或者原生基本类型数组等方式间接实现了类似功能却规避掉了这些问题[^2]. 综上所述,当确实需要手动构造带泛型标记的数组时候可以选择以上两种途径之一加以应对即可满足需求同时又能妥善处置伴随产生的各类提示信息。 ```java // 示例调用 Class<String> stringClass = String.class; String[] strings = createGenericArray(stringClass, 5); System.out.println(strings.length); // 输出: 5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值