大家请看注释处。
public class Test1 implements Comparable<Test1>{
static PriorityQueue<Test1> myT = new PriorityQueue<Test1>();
int i = 0;
public Test1(int i){
this.i = i;
myT.add(this);
}
public int compareTo(Test1 testA){
return this.i < testA.i ? -1 :
(this.i == testA.i ? 0 : 1);
}
public String toString(){
return "i = " + i;
}
public static void main(String[] args){
for(int i = 0; i < 4; i++){
new Test1(i);
}
System.out.println(myT.size());
int x = myT.size();
for(int i =0; i < x; i++){ //这里如果把 i<x 换成 myT.size()那么结果就只会出现2个(也就是少2个,现在这样是正常的)
System.out.println(myT.poll());
}
}
}

解决方案 »

  1.   

    比较器里放静态集合变量有意思
    楼主应该多看API 不清楚就查下 以后这种问题你遇到的机会多了
    poll()是出队列函数每poll一次队列中就会少一个对象 那么在第二次近如循环的时候myT.size()的值就少了一个二i的值是++的那么你不可能让所有的元素出队列
    for(int i = 0 ; i < myT.size();;){
    System.out.println(myT.poll());
    }
    or 
    while(myT.size > 0){
    System.out.println(myT.poll());
    }
      

  2.   

    这个问题很简单啊
    如果你用 i<myT.size(), 执行两次以后,i=2,myT做了两次出队列,所以myT.size()也就为2,所以这个循环也就只执行两次
      

  3.   

    myT.size()又不是不变量,楼主。
      

  4.   

    for循环中的两个";"分割的是3个表达式,第一个表达式是用以初始化或者声明循环子使用;
    第二个表达式是循环继续的条件表达式;
    第三个表达式是迭代控制表达式;
    for(int i =0; i < myT.size(); i++){ 
    }
    这段代码中初夏典型循环混乱问题:
    在循环的过程中循环体会改变循环条件表达式的条件!类似这样的循环:
    int j=10;
    for(int i=0;i<j;i++){
    ....................
    j++;
    }
    因为在每次循环开始时表达式二都会被计算一遍,所以循环可能会失去控制,出现不可预知的结果