Реализация String.equals

В JDK 8 String.equals реализуется как

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

Почему итерация использует две операции - увеличение i и уменьшение n вместо этого:

while (i < n) {
    if (v1[i] != v2[i])
        return false;
    i++;
}

или

while (i-- != 0) {
    if (v1[i] != v2[i])
        return false;
}

с одной приращением или декрементом?

Я полагаю, это как-то связано с оптимизацией байт-кода JVM, но не понимает, как это сделать.

Ответ 1

Я думаю, что это мертвый код, оставшийся с тех пор, когда Strings по-прежнему разделяли массивы поддержки и имели offset и count, так что вам нужно было немного подстроить индексы.

Реализация String была изменена в JDK 7 Update 6 (многие люди были расстроены этим, особенно, что это произошло в младшей версии). Строки больше не используют вспомогательный массив (если только сами строки не равны, и в этом случае новый дедупликатор пытается перераспределить их).

Вы можете увидеть обсуждение старой реализации на как работает String.equals().

Ответ 2

На самом деле этот Java-код не имеет прямого отношения к реальному машинным кодам (по крайней мере, для современного JVM рабочего стола/сервера). Вы можете прочитать о "Внутренних методах в VM HotSpot". Например. Когда JVM использует встроенные функции