在我们日常生活中的排队,其实与java编程语言中的一种比较重要的数据结构很类似,这种数据结构就是队列(Queue)。那么,我们应该怎么使用队列,它一般在哪些情况下使用呢?
下面这几点大致介绍了java队列使用的方法。
⑴、add(E),offer(E)在尾部添加;图片如下所示:
这两者的相似点是建议实现类禁止添加null元素,不然的话会造成报空指针NullPointerException;它们的不同之处则是add()方法在添加失败(比如队列已满)时会报一些运行时错误;但是offer()方法就算已经添加失败了它也不会崩溃,只会返回false。
同时需要注意的一点是,Queue是个接口,所以它提供的add,offer方法初衷是希望子类能够禁止添加元素为null,这样可以避免在查询时返回null的情况是否正确。虽然在实际情况中大多数Queue的实现类的确符合Queue接口的要求,比如ArrayBlockingQueue和PriorityBlockingQueue等等。但还是有一些实现类没有这样要求,比如LinkedList。
⑵、remove(),poll()删除并返回头部:图片如下所示
在队列为空的情况下 ,remove()方法会报NoSuchElementException错;但是poll()不会崩溃,它只会返回null。
⑶、element(),peek()获取但不删除:图片如下所示
当队列为空时element()会做出异常的反应;但是peek()不会崩溃,只会返回null。
还有一些其他的情况,如下文所示:
⑴、为什么会允许添加null元素?因为poll(),peek()方法在异常的时候会返回null,所以当你添加了null以后,是不好分辨究竟是否正确返回了的。
⑵、Queue一般都是FIFO的,但是也有特例,比如优先队列priority queue(它的顺序是根据自然排序或者自定义comparator的);还有一个就是LIFO的队列(跟栈一样,后来进去的先出去)。
但是无论进入、出去的先后顺序是怎样排列的,使用remove(),poll()方法操作的都是使用头部的元素;而插入的位置则不一定是在队尾,Queue插入逻辑视情况而定,不完全相同。
那么一般在什么情况下使用队列呢?
一般情况下,处理及时消息,并且花费的时间很短的话是不需要队列的,直接阻塞式的方法调用就可以了。但是如果处理消息需要消耗比较长的时间,而如果恰好来了新消息,它就只能处于阻塞状态,造成用户等待。在这种情况下就需要引入队列了。当接收到消息后,先把消息放在队列中,然后再用行的线程进行处理,这样就不会有消息阻塞了。
以上就是关于java队列使用的基本方法以及适用情况,这些都是一些基本的介绍,其他关于java的常见问题,敬请关注奇Q工具网。
推荐阅读: