Java 循环奇怪的行为

Java loop strange behaviour

我有这个拆分方法,其中有一个循环。这个循环是 运行ning 4 次,但它应该是 运行 5 次。知道为什么会这样吗?

public static <T> List<List<T>> split(List<T> bigCollection, int maxBatchSize) {
        List<List<T>> result = new ArrayList<List<T>>();

        if (CollectionUtils.isEmpty(bigCollection)) {
            // return empty list
        } else if (bigCollection.size() < maxBatchSize) {
            result.add(bigCollection);
        } else {
            for (int i = 0; (i + maxBatchSize) <= bigCollection.size(); i = i + maxBatchSize) {
                result.add(bigCollection.subList(i, i + maxBatchSize));
            }

            if (bigCollection.size() % maxBatchSize > 0) {
                result.add(bigCollection.subList((int) (bigCollection.size() / maxBatchSize) * maxBatchSize,
                    bigCollection.size()));
            }
        }

        return result;
    }

    public static void main(String[] args) {
        List<String> coll = new ArrayList<String>();
        coll.add("1");
        coll.add("2");
        coll.add("3");
        coll.add("4");
        coll.add("5");
        coll.add("6");
        coll.add("7");
        coll.add("8");

        System.out.println(split(coll, 2));
    }

输出 - [[1, 2], [3, 4], [5, 6], [7, 8]]

根据我的说法,这段代码应该在循环 运行 第五次时中断,它会尝试执行子列表功能。

当你在第 4 次迭代时,你的循环条件是这样的:

(i + maxBatchSize) <= bigCollection.size()
 6 + 2             <= 8

所以你要进去了。但是第五次迭代不再遵守这个条件,因为它是这样的:

(i + maxBatchSize) <= bigCollection.size()
 8 + 2             <= 8

别忘了您的病情不仅在 i,而且在 i + maxBatchSize

下面的for循环

for (int i = 0; (i + maxBatchSize) <= bigCollection.size(); i = i + maxBatchSize) {
    result.add(bigCollection.subList(i, i + maxBatchSize));
}

从 0 到 bigCollection.size() - maxBatchSize,步长为 maxBatchSize。在您的示例中,bigCollection 的大小为 8,而 maxBatchSize 的大小为 2,因此循环从 0 到 6,步长为 2。总共有 4 个步骤:0、2、4 和 6。

以下如果

if (bigCollection.size() % maxBatchSize > 0)

没有执行,因为8 % 2 = 0(所以subList没有执行)。