学习集合框架中多线程相关的集合--笔记
PriorityBlockingQueue:
这是一个无界的阻塞队列,使用和PriorityQueue 一样的排序规则,并且提供阻塞检索元素操作。虽然说这个队列在逻辑上是无界的,但是它可能会因为资源耗尽导致内存溢出错误。这个队列也不允许出现null值元素。一个具有优先级的阻塞队列依赖于Comparable接口的排序规则,而且的存放到队列中的元素必须实现Comparable接口,否则会出现类型转换异常。
这个类和他的迭代器均实现了Collection和Iterator 接口。迭代器由iterator()方法返回,但是返回的迭代器并不能保证的按指定的顺序遍历元素。如果需要按照指定的顺序遍历元素可以考虑使用Arrays.sort() ,如,将队列转化为数组,然后作为参数传进去获得有序的结果,Arrays.sort(pq.toArray());
如果不指定初始容量,那么默认初始容量为11. 容量在自动扩容的时候每次都是默认增长50%。
remainingCapacity(): 方法总是返回Integer.MAX_VALUE.因为一个无界阻塞队列没有容量限制。
因为这个队列是无界的,当使用offer(E e)方法的时候,这个方法不会返回false.当使用put(E e)方法的时候也不会阻塞。
removeAt(int i):这个方法可以移除指定位置的元素,但是没有返回值。
remove(Object o):这个方法可以移除指定元素,成功放回true,否则返回false。如果这个队列中有多个相同的元素,o.equals(e) 返回true则认为是相同,那么它只会删除一个。
toArray():这个方法将会以数组的形式返回这个队列中的元素的,但是这个数组中的元素并不是有序的。
ConcurrentLinkedQueue:
这是一个基于链节点,无界的线程安全的队列。这个队里遵循FIFO原则。这个队列适用于当多个线程需要同时访问一个普通的集合时。像其它并发集合的实现类一样,它也不允许有null值元素。
注意,这其它集合不一样的是,这队列的size()方法返回的元素个数并不是准确的,比如,这个队列在遍历的时候它的结构被修改了(如添加或移除)。此外,大批量的操作,比如调用addAll、removeAll、retainAll、containsAll、equals、toArray方法,这些方法不能保证被原子性的执行。例如:一个迭代操作和一个addAll()操作并发进行,那么可能只能遍历到部分新添加进来的元素。