突然对一个问题感到迷惑
同样是加减元素,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