Естественный порядок элементов в очереди приоритетов

Согласно документам, элементы приоритетной очереди упорядочен в соответствии с естественным порядком, то почему он печатает по-другому

public class PQ2 {

public static void main(String[] args) {
    PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
    pq.add(2);
    pq.add(4);
    System.out.println(pq);
    pq.offer(1);
    System.out.println(pq);
    pq.add(3);
    System.out.println(pq);
}
}

person kittu    schedule 06.05.2015    source источник
comment
В документе указано: Возвращает итератор для элементов в этой очереди. Итератор не возвращает элементы в каком-либо определенном порядке. Поскольку toString() использует итератор для построения содержимого в строку, вы не можете делать никаких предположений.   -  person Alexis C.    schedule 06.05.2015
comment
@АлексисС. Серьезно? Это вопрос от scjp Кэти и Бертс. Как я должен ответить на него? В любом случае спасибо за ответ   -  person kittu    schedule 06.05.2015
comment
Страница 654 глава 7. Я обновляю вопрос через секунду   -  person kittu    schedule 06.05.2015
comment
Обновил. Теперь посмотрите на фактический вопрос, который похож на то, что я задал   -  person kittu    schedule 06.05.2015
comment
Но они используют peek и poll, которые имеют четко определенное поведение. Это не имеет ничего общего с вашим первоначальным вопросом.   -  person Alexis C.    schedule 06.05.2015
comment
Фактический ответ - 2 2 3 4, однако, когда я пытаюсь выяснить ответ без использования IDE (как в сценарии экзамена), как определить порядок элементов? Я должен сначала найти порядок, чтобы получить фактический ответ, что невозможно   -  person kittu    schedule 06.05.2015
comment
Давайте продолжим обсуждение в чате.   -  person kittu    schedule 06.05.2015


Ответы (1)


Порядок вывода элементов определяется итератором класса PriorityQueue, который не упорядочен:

/**
 * Returns an iterator over the elements in this queue. The iterator
 * does not return the elements in any particular order.
 *
 * @return an iterator over the elements in this queue
 */
public Iterator<E> iterator() {
    return new Itr();
}

PriorityQueue использует toString() реализацию AbstractCollection, которая использует метод iterator() для перебора элементов.

Это не имеет ничего общего с порядком удаления элементов из очереди, который соответствует естественному порядку.

person Eran    schedule 06.05.2015