public boolean offer(E e) {
// null 检查,直接抛出运行时异常
if (e == null)
throw new NullPointerException();
modCount++;
int i = size;
// 判断数组容量,否则就扩容
if (i >= queue.length)
grow(i + 1);
// 底层数组容量+1
size = i + 1;
// 如果是第一个元素,放在第一个即可
if (i == 0)
queue[0] = e;
// 不是第一个元素,进行堆化过程,以满足堆的特性
else
siftUp(i, e);
return true;
}
// 堆化的插入过程, 这个过程是一个从下往上找的过程,直到堆顶或者中途结束
private void siftUpComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>) x;
while (k > 0) {
// 找到位置k的父节点的位置, (k - 1) >>> 1 是无符号右移操作,相当于 (k - 1) / 2
int parent = (k - 1) >>> 1;
// 暂存父节点位置的元素
Object e = queue[parent];
// 和父节点位置的元素比较一下,如果要插入的元素小于父节点,就退出
if (key.compareTo((E) e) >= 0)
break;
// 否则,把父节点下移
queue[k] = e;
// 继续往上找
k = parent;
}
// 找到了合适的插入位置,就把要插入的元素放进去
queue[k] = key;
}