反向 for 循环 - 需要解释

Reverse for-loop - explanation wanted

我在 java 中编程已经有一段时间了,但我只是回到基础知识并尝试真正理解正在发生的事情。

使用递减而不是递增的 for 循环反转字符串的语法是

for (int i = string.length() - 1; i >= 0; i--)

但是我不太明白为什么我要在.length()后面加上“-1”?这是我的代码。

public static void main(String[] args) {
    // TODO Auto-generated method stub
    reverseVertical("laptop");
}

private static void reverseVertical(String string) {
    // TODO Auto-generated method stub

    for (int i = string.length() - 1; i >= 0; i--) {
        System.out.println(string.charAt(i));
    }

}

“-1”背后的逻辑是什么?我无法理解它 - 除了它确实有效。

如果一个字符串有 4 个字符,您将通过 charAt(0) 获得第一个字符,通过 charAt(3) 获得最后一个字符,因为索引是从零开始的。所以你的循环将从 3 开始到 0 结束,而不是从 4 开始。

您必须从 length - 1 开始,因为与许多其他 Java 列表和数组一样,字符串是 0 索引。这意味着它们的索引从 0 到 capacity - 1.

尝试读取 capacity 的位置将导致 IndexOutOfBoundsException

这里的关键是 String 个对象由 char[] 支持。因此遍历字符串遵循任何其他 Java 数组的规则,其中 .length() 是数组的大小(计数、容量)。对任何数组(包括字符串)的索引都是基于 0 的,因此 "first" 槽中的项目使用 0 等进行访问。

如果分配的大小为 n,则数组从索引 0 开始到 n-1。 为防止出现 IndexOutOfBoundException,正确(最高)的有效索引为 n-1。 然而 array.lenght 将 return n。所以你必须移动索引。

如果您有一个字符串 "Test",则总长度为 4,但字符计数从 0 开始到 3 结束,并且如果您的循环中的字符串长度为 string.length() ,它会是 4,但它以 3 结尾。

所以这里你的循环将从 3 开始,到 0 结束。 所以为了避免 IndexOutOfBoundsException 变成 string.length()-1