一个问题引发的探索:Queue到底用add/remove还是offer/poll

博客探讨了Java集合框架中Queue接口的add()、poll()、offer()和remove()方法的使用和区别。文章指出,尽管PriorityQueue使用了add()和poll(),但offer()和poll()主要是为有界队列设计,特别是用于并发环境。文章建议在处理可能满的队列时使用offer(),因为它在操作失败时返回false,而不会抛出异常。同时,文章强调了在处理Queue时,offer和poll可以更好地处理返回值,避免异常。
摘要由CSDN通过智能技术生成

突然对一个问题感到迷惑
同样是加减元素,HashMap用put()和remove(),HashSet用add()和remove(),LinkedList用offer()和poll()。毕竟是两组不同的类,还可以接受
然鹅…
PriorityQueue你为什么用add()和poll()???

于是想理一下它们的关系
扒官方Tutorials看看

https://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html
https://docs.oracle.com/javase/tutorial/collections/interfaces/index.html

【在The Queue Interface中找到答案】



Interfaces

两棵不同的树 - “a Map is not a true Collection”

为了保持核心接口的简洁,并没有给不同的集合类( immutable, fixed-size, append-only)提供不同的接口,而是把修改方法设计成可选的。调用不支持的方法时,抛UnsupportedOperationException

核心接口:

  • Collection:根,没有实现类
  • Set:无序,不重复
  • List:有序,可重复。一般可以通过index准确的插入、获取元素
  • Queue:保存待处理的一系列元素。一般(但不必须)是FIFO的。例外就是优先级队列
  • Deque:双端队列,既可以FIFO,也可以LIFO
  • Map:键值对,键不重复

以及Set和Map的排序版本:SortedSet(如用在单词表)、SortedMap(如用在电话簿)

The Collection Interface

包含基础操作如:

  • int size()
  • boolean isEmpty()
  • boolean contains(Object element)
  • boolean add(E element)
  • boolean remove(Object element)
  • Iterator iterator()

对整个集合进行的操作如:

  • boolean containsAll(Collection<?> c)
  • boolean addAll(Collection<? extends E> c)
  • boolean removeAll(Collection<?> c)
  • boolean retainAll(Collection<?> c)
  • void clear()

还有操作数组的方法如:

  • Object[] toArray()
  • T[] toArray(T[] a)

JDK8之后还提供:

  • Stream stream()
  • Stream parallelStream()

Collection接口提供了各种基本方法,它可以告诉你集合中有多少元素(size, isEmpty)、检查一个元素是不是在集合里(contains)、从集合中增减元素(add, remove)、遍历集合中的元素(iterator)

add方法足够通用,允许重复和不允许的集合都可以用。它保证调用结束后集合中包含指定元素,如果集合改变则返回true。remove也一样,它假设集合包含指定元素,如果改变则返回true

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
文档看到这里,猜测是不是Queue也可以用add()和remove()?试了一下,果然

都 没 毛 病 !

那为什么要有add()和offer()呢?MARK一下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

三种遍历方法

1. Aggregate Operations

JDK 8及以后,对集合进行迭代的首选方法是获取流并对其执行聚合操作。聚合常和lambda表达式一起使用,使程序更高效,代码更少

https://docs.oracle.com/javase/tutorial/collections/streams/index.html

照Lesson: Aggregate Operations的例子试了一下

Set<Person> roster = new HashSet<>();
roster.add(new
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值