À l'aide d'une instruction switch est plus rapide que equals (mais seulement sensiblement lorsqu'il y a plus que quelques chaînes), car il utilise tout d'abord l' hashCode
de la chaîne de l' switch
pour déterminer le sous-ensemble de toutes les chaînes qui pourrait éventuellement correspondre. Si plus d'une corde dans le cas des étiquettes a le même hashCode, la JVM va effectuer séquentielle des appels d' equals
, et même si il y a une seule chaîne de caractères dans le cas des étiquettes qu'un hashCode, la JVM doit appeler equals
pour confirmer que la chaîne dans le cas de l'étiquette est vraiment égal à celui de l'interrupteur d'expression.
Les performances d'exécution d'un interrupteur sur des objets de Chaîne est comparable à une recherche dans une HashMap
.
Ce morceau de code:
public static void main(String[] args) {
String s = "Bar";
switch (s) {
case "Foo":
System.out.println("Foo match");
break;
case "Bar":
System.out.println("Bar match");
break;
}
}
Est à l'intérieur compilé et exécuté comme ce morceau de code:
(pas littéralement, mais si vous décompiler les deux morceaux de code que vous voyez que exactement la même séquence d'actions)
final static int FOO_HASHCODE = 70822; // "Foo".hashCode();
final static int BAR_HASHCODE = 66547; // "Bar".hashCode();
public static void main(String[] args) {
String s = "Bar";
switch (s.hashCode()) {
case FOO_HASHCODE:
if (s.equals("Foo"))
System.out.println("Foo match");
break;
case BAR_HASHCODE:
if (s.equals("Bar"))
System.out.println("Bar match");
break;
}
}