Queue 集合学习 java

Queue

Queue接口用来模拟队列这种数据结构。
Queue接口中定义了如下几个方法:
add :将指定元素加入此队列的尾部
element: 获取队列头部元素但是不删除
offer:将指定的元素加入到此队列尾部,当使用容量有限的队列时,此方法通常比add好
peek:获取队列头部的元素,但是不删除
poll:获取队列头部的元素,并删除该元素’
remove:获取队列头部的元素,并删除该元素
PriorityQueue实现类
PriorityQueue:保存队列元素的顺序并不是按加入队列的顺序,而是按照队列元素的大小进行排序。

package Queue;

import java.util.PriorityQueue;

public class PriorityQueueTest {
    public static void main(String[] args) {
        PriorityQueue priorityQueue = new PriorityQueue();
        priorityQueue.offer(6);
        priorityQueue.offer(-6);
        priorityQueue.offer(3);
        priorityQueue.offer(60);
        System.out.println(priorityQueue);
        System.out.println(priorityQueue.poll());
    }
}

结果如下:
在这里插入图片描述
PriortyQueue不允许插入null,它还需要对队列元素进行排序,PriortyQueue的元素有两种排序方式,第一种是自然排序:采用自然顺序的PriorityQueue集合中的元素必须实现了Comparable接口。而且是同一个类的多个实例。
第二种是定制排序:创建PriorityQueue队列时,传入一个Comparator对象,该对象负责对队列中所有的元素进行排序。
Deque接口与ArrayDeque接口
Deque接口是Queue接口的子接口,它代表一个双端队列(可以当做栈来用),Deque接口中定义了一些双端队列的方法,这些方法允许 从两端来进行操作队列的元素。
Deque中包含了pop方法和push方法,故可以当做栈来进行使用。
Deque接口提供了一个典型德实现类,ArrayDeque,从名称中就可以看出来,它是一个基于数组实现的双端队列,创建Deque时同样可以指定一个numElements参数,该参数用于指定Object[]数组的长度。如果不指定numElements参数,Deque底层数组的长度是16。
下面程序示范把ArrayDeque当做栈来使用:

package Queue;

import java.util.ArrayDeque;

public class ArrayDequeStack {
    public static void main(String[] args) {
        ArrayDeque stack = new ArrayDeque();
        stack.push("hello");
        stack.push("world");
        stack.push("luguobao");
        //先进后出,栈的特性
        System.out.println(stack);
        System.out.println(stack.peek());
        System.out.println(stack);
        System.out.println(stack.pop());
        System.out.println(stack);
    }
}

结果如下:
在这里插入图片描述
推荐使用ArrayDeque来当做栈,来代替Stack 因为Stack是古老的集合性能较差
栈是先进后出,所以第一个弹出的是最后一个加入的,所以,先弹出luguobao
如果是当做队列,则是先进先出;
代码如下:所用的方法是不一样的

package Queue;

import java.util.ArrayDeque;

public class ArrayDequeQueue {
    public static void main(String[] args) {
        ArrayDeque queue = new ArrayDeque();
        queue.offer("hello");
        queue.offer("world");
        queue.offer("luguobao");
        System.out.println(queue);
        //访问第一个元素但是不删除
        System.out.println(queue.peek());
        //访问第一个元素并且删除
        System.out.println(queue.poll());
        System.out.println(queue);
    }
}

在这里插入图片描述
结果还是符合预期的。
通过上面的两个程序可以看出来ArrayDeque不仅可以作为栈使用,还可以作为队列使用。
LinkedList实现类
LinkedList类是List接口的实现类–这意味着它是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList还实现了Deque接口,可以被当做双端队列来使用,因此既可以被当做“栈”来使用,也可以当做队列来使用。
测试代码如下:

package Queue;

import java.util.LinkedList;

public class LinkedListTest {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        //将字符串元素加入到队列尾部
        linkedList.offer("hello");
        //将字符串加到栈的顶部
        linkedList.push("world");
        //将字符串元素添加到队列的头部(相当于栈的顶部)
        linkedList.offerFirst("luguobao");
        System.out.println(linkedList);
        //以List索引访问的方式来遍历集合
        //结果显示是从栈顶先开始的
        for (int i = 0; i < linkedList.size(); i++) {
            System.out.println("遍历中:" + linkedList.get(i));
        }
        //访问并不删除栈顶元素
        System.out.println(linkedList.peekFirst());
        //访问但不删除队列的第一个元素
        System.out.println(linkedList.getFirst());
        //队列加入是加到最后的
        linkedList.offer("test");
        //栈加入是加到最前的
        linkedList.push("test2");
        System.out.println(linkedList);
        //出队列或者栈的顺序都是从左往右出
        System.out.println(linkedList.peek());
        //访问并删除队列中的最后一个元素
        System.out.println(linkedList.pollLast());
    }
}

结果如下:
在这里插入图片描述
上面代码分别示范了LinkedList作为List集合、双端队列、栈的用法。由此可见,LinkedList是一个功能非常强大的集合类。
LinkedList与ArrayList、ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList内部是以链表的形式来保存集合中的元素,因此随机访问集合元素时性能较差,但是在插入、删除元素时性能比较出色。
**注意:**对于所有的内部基于数组的集合实现,比如说ArrayList、ArrayDeque等,使用随机访问的性能比使用Iterator迭代访问的性能要好,因为随机访问会被映射成对数组元素的访问。
关于使用List集合有如下建议
如果需要遍历List集合元素,对于ArrayList集合,应该使用随机访问法(get)来遍历集合元素,这样性能最好。对于LinkedList集合,应该采用迭代器(Iterator)来遍历集合元素
如果需要经常执行插入、删除操作,可以考虑使用LinkedList集合,使用ArrayList集合,可能要经常重新分配内部数组大小,效果不好。
如果有多个线程需要同时访问List集合元素,开发者可考虑使用Collection将集合包装成为线程安全的集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值