PriorityQueue是很有用的,然而它有一些奇怪的地方。
首先,它不支持clone(),而大多数util库里边的类都implements了cloneable,见这里
然后,它不支持迭代器,然而还能通过contains()查找一个元素在不在里面,原来有一个私有的private int indexOf(Object o)
方法。它的父类java.util.AbstractQueue<E> (implements java.util.Queue<E>) ,java.util.Queue<E> 是java.lang.Iterable<T> 的子接口,它实际上也可以只不过把这个功能隐蔽了。
我相信这两个特点足以造成一些使用不便,但设计者肯定有意为之。暂时的猜想是,PriorityQueue被定位为近似“用后即弃”的东西,或者功能简单化定位,除了储存一些东西不与其他对象发生太大关系。
今天做练习时候遇到的情况是,我希望PriorityQueue清空之后重复使用原来的东西,克隆正是合适,但不能克隆就考虑建一个一模一样的PriorityQueue,然后让用过的对象指向这个复制品,简单的等号=而已——然而出现了奇怪的一幕:
这是个void方法的最后一步,运行过程中前面的东西都执行了,这个copy也完全正常,但就这一步不执行。
通过赋值运算符让对象的引用发生改变,在这里无效,这是我第一次遇到这种情况,上一次是唯一一次不小心把命令弄到return之后的情况。
不知道这是不是跟PriorityQueue的设计有关。