public static void main(String[] args) {
String str1 = null;
String str2 = "test";
System.out.println(str1.equals(str2));//Exécuter 1
System.out.println(str2.equals(str1));//Exécution 2
}
L'exécution 1 déclenche une exception java.lang.NullPointerException. La cause de l'exception est que j'ai mis null dans str1 et appelé la méthode à partir de l'objet null. L'appel d'une méthode à partir d'un str2 non nul ne lèvera plus d'exception et retournera false.
L'écriture de l'exécution 2 a l'avantage qu'une exception ne se produit pas même si str1 est nulle, mais elle a l'inconvénient qu'il est difficile de remarquer des erreurs de code si elle est implémentée sans supposer que null sera entré comme un système anormal. Je pense.
Si vous êtes conscient de la vérification de null, il peut être plus sûr de l'attraper avec la gestion des exceptions.
public static void main(String[] args) {
String str1 = null;
String str2 = "test2";
try {
System.out.println(str1.equals(str2));
}catch(NullPointerException ex) {
System.out.println("Capture d'exception");
}
}
public static void main(String[] args) {
String str1 = "test1";
String str2 = "test1";
System.out.println(str1.equals(str2));//Résultat 1
System.out.println(str1 == str2); //Résultat 2
}
Le résultat 1 est bien sûr vrai, mais qu'en est-il du résultat 2? En conclusion, le résultat 2 est également vrai.
En effet, il existe un mécanisme appelé pool constant. Les caractères littéraux apparaissent fréquemment dans le programme. Cependant, si vous créez une instance de String à chaque fois, elle consommera beaucoup de mémoire.
Si le même littéral de chaîne réapparaît, la référence à l'instance de chaîne dans l'espace mémoire de la constante sera "réutilisée". Il s'agit d'un mécanisme appelé pool constant.
Ce pool de constantes n'est valide que lors de l'utilisation de chaînes littérales. Si vous écrivez explicitement pour créer une nouvelle instance à l'aide de l'opérateur new, une instance sera créée à chaque fois et chaque variable aura une référence différente.
public static void main(String[] args) {
String str1 = new String("test");
String str2 = "test";
System.out.println(str1.equals(str2));//true
System.out.println(str1 == str2); //false
}
Vous ne le verrez pas dans un programme réel, mais soyez prudent car c'est un déclencheur courant dans Java Silver.
Vous pouvez utiliser la méthode equalsIgnoreCase pour déterminer l'équivalence sans tenir compte de la casse. Cependant, je pense que la fréquence d'apparition est considérablement inférieure à celle des égaux.
public static void main(String[] args) {
String str1 = "abc";
String str2 = "ABC";
System.out.println(str1.equals(str2)); //false
System.out.println(str1.equalsIgnoreCase(str2));//true
}
c'est tout
Recommended Posts