Java PriorityQueue似乎在调用add()时更改了以前添加的值

Java PriorityQueue似乎在调用add()时更改了以前添加的值,java,collections,priority-queue,Java,Collections,Priority Queue,我感到困惑,因为我正在使用的优先级队列似乎在添加新值的同时更改或重新排序循环中先前添加的值。到目前为止,它只发生在这个测试用例中 以下是我的调试器的一些片段: 在添加第6个元素之前: 添加第6个元素后: 代码示例如下所示: package mixedobjectsset; import java.util.PriorityQueue; import java.util.Queue; public class MixedObjectsSet { private static final

我感到困惑,因为我正在使用的优先级队列似乎在添加新值的同时更改或重新排序循环中先前添加的值。到目前为止,它只发生在这个测试用例中

以下是我的调试器的一些片段:

在添加第6个元素之前:

添加第6个元素后:

代码示例如下所示:

package mixedobjectsset;

import java.util.PriorityQueue;
import java.util.Queue;

public class MixedObjectsSet {

private static final char union = '\u222A';
private static final char intersection = '\u2229';
private static final char product = '\u2A2F';
private static final char difference = '\u2216';


public static void main(String[] args) {
    MixedObjectsSet m = new MixedObjectsSet();
    m.operatorsQueue("(({1,2}" + difference + "{1,3})" +
            difference + "({1 } " + union + "{4})) " + union + "{1,3}");
}

public Queue operatorsQueue(String expr){

    Queue<Character> queue = new PriorityQueue<>();
    char[] exprCharArr = expr.toCharArray();

    for (int j = 0; j < exprCharArr.length; j++) {
        switch (exprCharArr[j]){
            case '(':
                queue.add('(');
                break;
            case ')':
                queue.add(')');
                break;
            case '\u222A':
                queue.add(union);
                break;
            case '\u2216':
                queue.add(difference);
                break;
            case '\u2A2F':
                queue.add(product);
                break;
            case '\u2229':
                queue.add(intersection);
                break;
            case ';':
                queue.add(';'); //for adding to storage instead of calculations
                break;
        }
    }


    System.out.println("queue.toString() = " + queue.toString());

    return queue;


   }
}
包混合对象集;
导入java.util.PriorityQueue;
导入java.util.Queue;
公共类混合对象集{
私有静态最终字符联合='\u222A';
私有静态最终字符交集='\u2229';
私有静态最终字符乘积='\u2A2F';
私有静态最终字符差异='\u2216';
公共静态void main(字符串[]args){
MixedObjectsSet m=新的MixedObjectsSet();
m、 运算符队列(({1,2}+difference+“{1,3})”+
差异+“({1}”+联合+“{4}”)”+联合+“{1,3}”);
}
公共队列运算符队列(字符串表达式){
Queue Queue=new PriorityQueue();
char[]exprCharArr=expr.toCharArray();
对于(int j=0;j
Array
queue
中的
PriorityQueue
实现不按元素从队列中轮询出来的顺序存储元素
PriorityQueue
是一个数组,堆存储在
queue
数组中,如下所述。这意味着您不应该查看
队列
数组(除非您知道二进制堆是如何工作的),因为它是一个封装的实现细节,它的名称可能与您期望的有所不同。

实际上,“您不应该查看队列数组”有点苛刻。打印数组(这是基础集合
.toString()
所做的)或使用调试器查看它是可以的。不要理会命令。正如你所说,它是一种抽象的数据类型。我坚信它的FIFO。我知道不是。感谢you@Gene特别是,作为公共API的一部分,
toString()
,将揭示内部顺序,并对其进行迭代或调用
toArray()
以获取副本(毕竟,它是一个
集合
实现),因此指出“方法迭代器()中提供的迭代器”更具建设性不能保证以任何特定的顺序遍历优先级队列的元素。“因此,您可以查看它,但不期望有特定的顺序。@Holger明白了。我只是想指出,关注内容而不是顺序是可以的。两组人在同一条船上。