public E poll(){if(size ==0)return null;int s =--size;
modCount++;
E result =(E) queue[0];//0下标处的那个元素就是最小的那个
E x =(E) queue[s];
queue[s]= null;if(s !=0)siftDown(0, x);//调整return result;}
上述代码首先记录0下标处的元素,并用最后一个元素替换0下标位置的元素,之后调用siftDown()方法对堆进行调整,最后返回原来0下标处的那个元素(也就是最小的那个元素)。重点是siftDown(int k, E x)方法,该方法的作用是从k指定的位置开始,将x逐层向下与当前点的左右孩子中较小的那个交换,直到x小于或等于左右孩子中的任何一个为止。
//siftDown()privatevoidsiftDown(int k, E x){int half = size >>>1;while(k < half){//首先找到左右孩子中较小的那个,记录到c里,并用child记录其下标int child =(k <<1)+1;//leftNo = parentNo*2+1
Object c = queue[child];int right = child +1;if(right < size &&
comparator.compare((E) c,(E) queue[right])>0)
c = queue[child = right];if(comparator.compare(x,(E) c)<=0)break;
queue[k]= c;//然后用c取代原来的值
k = child;}
queue[k]= x;}
//remove(Object o)publicbooleanremove(Object o){//通过遍历数组的方式找到第一个满足o.equals(queue[i])元素的下标int i =indexOf(o);if(i ==-1)returnfalse;int s =--size;if(s == i)//情况1
queue[i]= null;else{
E moved =(E) queue[s];
queue[s]= null;siftDown(i, moved);//情况2......}returntrue;}