Implémentation Ssortingng.equals

Dans JDK 8, Ssortingng.equals implémenté en tant que

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

Pourquoi l’itération utilise-t-elle deux opérations – incrémenter i et décrémenter n au lieu de quelque chose comme ça:

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

ou

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

avec une opération d’incrémentation ou de décrémentation?

Je suppose que cela est en quelque sorte lié à l’optimisation du bytecode de la machine virtuelle Java, mais je ne comprends pas comment.

Je pense que c’est du code mort, qui rest de l’époque où Ssortingngs partageait encore des tableaux de sauvegarde, avec offset et count , de sorte que vous deviez modifier légèrement les index.

L’implémentation de chaîne a été modifiée dans la mise à jour 6 de JDK 7 (beaucoup de personnes étaient contrariées à ce sujet, notamment par le biais d’une version mineure). Les chaînes ne partagent plus le tableau de sauvegarde (à moins que les chaînes ne soient elles-mêmes égales, auquel cas un nouveau déduplicateur tente de les partager à nouveau).

Vous pouvez voir une discussion de l’ancienne implémentation à ” comment fonctionne Ssortingng.equals () “.

En réalité, ce code java n’a pas de relation directe avec le code machine réel (du moins pour la JVM de bureau / serveur moderne). Vous pouvez en savoir plus sur “Méthodes insortingnsèques dans HotSpot VM”. Par exemple, quand la machine virtuelle Java utilisera-t-elle