Quelques réflexions sur l'interrupteur (la différence entre seitch et ifelse ...)

Comparaison de Switch et If - else

La différence fondamentale entre switch ... case et if ... else est:

  • switch ... case générera une table de saut pour indiquer l'adresse de la branche de cas réelle, et le numéro d'index de cette table de saut est égal à la valeur de la variable de commutation. Par conséquent, switch ... case n'a pas besoin de traverser la branche conditionnelle jusqu'à ce qu'il atteigne la condition comme if ... else, mais n'a besoin que d'accéder à l'entrée correspondant au numéro d'index pour atteindre l'objectif de localisation de la branche.

Spécifiquement:

  • switch ... case va générer une table de sauts dont la taille (nombre d'entrées) est la plus grande constante de cas + 1.
  • Le programme juge d'abord si la variable de commutation est supérieure à la constante de casse maximale, et si elle est supérieure, il saute à la branche par défaut pour le traitement;
  • Sinon, obtenez l'adresse de l'entrée de la table de saut dont le numéro d'index est la taille de la variable de commutation (c'est-à-dire l'adresse de début de la table de saut + la taille de l'élément de la table * numéro d'index) (similaire à ArrayList qui implémente le RandomAccess random interface d'accès )
  • Le programme saute alors à cette adresse pour l'exécution, et le saut de branche est terminé.

De ce point de vue, l' interrupteur est un peu le sens de l'espace pour le temps , et en fait c'est vrai.


1. Lorsqu'il y a de nombreuses succursales, l'efficacité de l'utilisation du commutateur est très élevée. Étant donné que le commutateur est accédé de manière aléatoire, il saute directement à cette branche spécifique après avoir déterminé la valeur sélectionnée, mais si ... else est un parcours, il obtient les valeurs possibles, sachant trouver la branche qui remplit les conditions. De cette manière, l'efficacité du switch est en effet bien supérieure à celle d'ifelse.

2. On peut savoir d'après le code d'assemblage ci-dessus que switch ... case occupe plus d'espace de code car il doit générer une table de saut, en particulier lorsque la constante case a une grande plage de distribution mais que la valeur effective réelle est relativement petite, L'utilisation de l'espace de cas deviendra très faible.

3. switch ... case ne peut gérer que le cas où le cas est une constante, et il ne peut rien faire pour un cas non constant. Par exemple, si (a> 1 && a <100), il ne peut pas être géré par switch ... case. Par conséquent, le commutateur ne peut être plus efficace que sinon dans la branche de sélection constante, mais sinon peut être appliqué à plus d'occasions, ifelse est plus flexible.

Utilisation d'Enum dans le commutateur JDK1.5

Avant JDK 1.5, les types de données pris en charge par l'instruction switch étaient byte, short, int et char.

Après JDK1.5, un type d'énumération a été ajouté . Le type d'énumération peut organiser uniformément les constantes d'état et ajouter des attributs de base. 

L'énumération peut également suivre Sewitch. La raison en est que switch calcule d'abord la valeur de tri de la variable, puis la compare à chaque valeur de tri de la constante d'énumération. Lorsque la variable est vide, la méthode ordinale est appelée pour signaler une exception de pointeur nul. . Par conséquent, il est nécessaire de juger le code avec des exigences de sécurité élevées .

interrupteur (s) = s.ordinal ;

Utilisation de Spring dans le commutateur jdk1.7

Dans Java 1.7, la prise en charge du type String a été ajoutée : le mécanisme implémenté consiste à faire correspondre la valeur de hachage de la chaîne. La figure suivante montre le fichier d'origine avant et après la compilation,

(À gauche) Comparaison des fichiers de classe Java et (à droite).

On peut voir que le commutateur de la chaîne est converti en deux traitements de commutation, les données sont mises en correspondance via la valeur de hachage et le code spécifique est rapidement exécuté dans le commutateur via la variable d'octet définie .

 

Je suppose que tu aimes

Origine blog.csdn.net/sanhewuyang/article/details/107673326
conseillé
Classement