有人可以帮助将这个简洁的 Java 函数解构为简单的英语吗?

Can someone help deconstruct this terse Java function into plain English?

我正在尝试将 PriorityQueue class 从 OpenJDK implementation 移植到另一种没有类似数据结构的语言 (Xojo)。我真的很努力将以下方法分解为伪代码,以便我可以将其转换为 Xojo:

public E poll() {
  final Object[] es;
  final E result;

  if ((result = (E) ((es = queue)[0])) != null) {
    modCount++;
    final int n;
    final E x = (E) es[(n = --size)];
    es[n] = null;
    if (n > 0) {
      final Comparator<? super E> cmp;
      if ((cmp = comparator) == null)
        siftDownComparable(0, x, es, n);
      else
        siftDownUsingComparator(0, x, es, n, cmp);
      }
    }
    return result;
}

变量 queue 是在 class 上定义的 Object[] 数组。

有几行让我感到困惑。第一:

if ((result = (E) ((es = queue)[0])) != null)

这是否意味着“将数组 queue 分配给变量 es 并访问元素 0 并在 不是 时执行以下操作无效的?” result = (E) 表达式是什么意思?我知道 E 是泛型。

final E x = (E) es[(n = --size)];的运算顺序是什么?这是否意味着递减 size,将该值分配给 n,然后访问 es 数组中的该索引?如果是这样,这个表达式之前的 x = (E) 是什么意思?我猜这意味着将元素转换为类型 E?

最后,这些行:

final Comparator<? super E> cmp;
if ((cmp = comparator) == null)

comparator 是一个 class 变量(持有 Comparator)。为什么要赋值给局部变量cmp,第一行的问号是什么意思?

1- if ((result = (E) ((es = queue)[0])) != null)
首先,它将数组 queue 分配给变量 es 并从中获取元素 0 并将其转换为 E 泛型并将其分配给 result 然后检查如果 result 不为空。

2- final E x = (E) es[(n = --size)];
首先 java 评估 --size 然后分配给 int 类型 n 然后从 es 数组中获取第 n,将其转换为 E,然后分配它到变量 x.


我想你问的接下来的两行现在很清楚了!

看看我能不能帮上忙:

if ((result = (E) ((es = queue)[0])) != null)

上面的意思是“将queue分配给es,访问它的索引0,将其转换为类型E,将其分配给result并执行以下操作如果它不为空。

final E x = (E) es[(n = --size)];

这意味着“从 size 中减去一个并将新值分配给 n,将其用作 es 的索引并将该元素转换为类型 E , 然后将其赋值给 E.

类型的最终变量 x

final Comparator<? super E> cmp;

问号是通配符。 <? super E> 表示“某种类型是 E 的祖先”。至于为什么 comparator 被赋值给局部变量 cmp,我不是很确定,但我记得最近在另一个问题中被问到类似的问题。我会看看是否可以找到它并编辑此答案。我希望这至少能对你有所帮助。如果我所说的任何内容不清楚,请提问,我会尝试改写解释。

编辑:是我在上一段提到的问题。答案表明性能优势,但我再次不确定这是否是这种情况的原因,因为具体情况略有不同。

Does this mean "assign the array queue to the variable es"

是的。

and access element 0 and do the following if it's not null?

是的。

What does the result = (E) expression mean?

在上面两个表达式的同时,也将queue[0]赋值给了result(E) 是对类型的强制转换。所以它基本上只是:

result = queue[0]

加上一些额外的东西。

final E x = (E) es[(n = --size)];? Does this mean decrement size, assign that value to n and then access this index within the es array?

是的。

If so, what does x = (E) before this expression mean? I'm guessing it means to cast the element to type E?

是的,又是像以前一样的演员表。

comparator is a class variable

为了迂腐,comparator 可能是一个实例变量,而不是 class 变量。检查它的定义。

Why assign it to a local variable cmp

我想复制一个局部变量。我在代码中看不到这样做的充分理由,所以这可能是一个错误,或者是在更改了之前的代码后留下的东西。

and what does the question mark mean on the first line?

问号表示 Comparator 的类型未知,可以是任何类型,只要它是 E 的超级 class。例如,如果 Integer 没有 ComparatorNumber 有,那没关系,NumberInteger 的超 class这已经足够了。