java队列使用的方法是什么?它应该在什么情况下使用?

BSO 2020-08-25 15:01:44 java常见问答 5700

在我们日常生活中的排队,其实与java编程语言中的一种比较重要的数据结构很类似,这种数据结构就是队列(Queue)。那么,我们应该怎么使用队列,它一般在哪些情况下使用呢?

下面这几点大致介绍了java队列使用的方法。

⑴、add(E),offer(E)在尾部添加;图片如下所示:

java队列使用

这两者的相似点是建议实现类禁止添加null元素,不然的话会造成报空指针NullPointerException;它们的不同之处则是add()方法在添加失败(比如队列已满)时会报一些运行时错误;但是offer()方法就算已经添加失败了它也不会崩溃,只会返回false。

同时需要注意的一点是,Queue是个接口,所以它提供的add,offer方法初衷是希望子类能够禁止添加元素为null,这样可以避免在查询时返回null的情况是否正确。虽然在实际情况中大多数Queue的实现类的确符合Queue接口的要求,比如ArrayBlockingQueue和PriorityBlockingQueue等等。但还是有一些实现类没有这样要求,比如LinkedList。

⑵、remove(),poll()删除并返回头部:图片如下所示

java队列使用

在队列为空的情况下 ,remove()方法会报NoSuchElementException错;但是poll()不会崩溃,它只会返回null。

⑶、element(),peek()获取但不删除:图片如下所示

java队列使用

当队列为空时element()会做出异常的反应;但是peek()不会崩溃,只会返回null。

还有一些其他的情况,如下文所示:

⑴、为什么会允许添加null元素?因为poll(),peek()方法在异常的时候会返回null,所以当你添加了null以后,是不好分辨究竟是否正确返回了的。

⑵、Queue一般都是FIFO的,但是也有特例,比如优先队列priority queue(它的顺序是根据自然排序或者自定义comparator的);还有一个就是LIFO的队列(跟栈一样,后来进去的先出去)。

但是无论进入、出去的先后顺序是怎样排列的,使用remove(),poll()方法操作的都是使用头部的元素;而插入的位置则不一定是在队尾,Queue插入逻辑视情况而定,不完全相同。

那么一般在什么情况下使用队列呢?

一般情况下,处理及时消息,并且花费的时间很短的话是不需要队列的,直接阻塞式的方法调用就可以了。但是如果处理消息需要消耗比较长的时间,而如果恰好来了新消息,它就只能处于阻塞状态,造成用户等待。在这种情况下就需要引入队列了。当接收到消息后,先把消息放在队列中,然后再用行的线程进行处理,这样就不会有消息阻塞了。

以上就是关于java队列使用的基本方法以及适用情况,这些都是一些基本的介绍,其他关于java的常见问题,敬请关注奇Q工具网。

推荐阅读:

java队列处理高并发怎么实现?

java队列和栈的区别有哪些?

java队列入门解析