如何实现CopyOnWriteArrayList类的remove(Object o,Object [] snapshot,int index)?

时间:2018-06-06 18:55:10

标签: java

我不明白这里如何计算 findindex ,我从未见过这样的事情。请解释下面的代码。

private boolean remove(Object o, Object[] snapshot, int index) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] current = getArray();
        int len = current.length;
        if (snapshot != current) findIndex: {
            int prefix = Math.min(index, len);
            for (int i = 0; i < prefix; i++) {
                if (current[i] != snapshot[i] && eq(o, current[i])) {
                    index = i;
                    break findIndex;
                }
            }
            if (index >= len)
                return false;
            if (current[index] == o)
                break findIndex;
            index = indexOf(o, current, index, len);
            if (index < 0)
                return false;
        }
        Object[] newElements = new Object[len - 1];
        System.arraycopy(current, 0, newElements, 0, index);
        System.arraycopy(current, index + 1,
                         newElements, index,
                         len - index - 1);
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}
  • 还有什么打破findIndex; 呢?
  • 您认为这种功能是什么?何时推出?
  • findIndex是一个变量或方法,还是像静态块一样?它是什么类型的?

1 个答案:

答案 0 :(得分:1)

&#34; findIndex&#34;是一个标签,相应的休息时间间隔为&#34;直到&#34;那个标签。

换句话说:这是一种允许您在嵌套循环中继续/中断外部循环的机制!

这只是普通break / continue的一个更强大的版本。它很少使用,因为它可以快速增加代码的复杂性(基本上它打破了结构化编程中的单入口/单出口原则)。

从这个角度来看,它是 goto 命令的Java版本。