public static void main(String[] args) {
String str1 = null;
String str2 = "test";
System.out.println(str1.equals(str2));//Führen Sie 1 aus
System.out.println(str2.equals(str1));//Ausführung 2
}
Ausführung 1 löst eine java.lang.NullPointerException aus. Die Ursache für die Ausnahme ist, dass ich null in str1 eingefügt und die Methode vom null-Objekt aufgerufen habe. Das Aufrufen einer Methode von einem Nicht-Null-Str2 löst keine Ausnahme mehr aus und gibt false zurück.
Die Art und Weise, die Ausführung 2 zu schreiben, hat den Vorteil, dass eine Ausnahme nicht auftritt, selbst wenn str1 null ist, aber es gibt den Nachteil, dass es schwierig ist, Codefehler zu bemerken, wenn sie implementiert werden, ohne anzunehmen, dass null als abnormales System eingegeben wird. Ich denke.
Wenn Ihnen die Nullprüfung bekannt ist, ist es möglicherweise sicherer, sie mit Ausnahmebehandlung abzufangen.
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("Ausnahme fangen");
}
}
public static void main(String[] args) {
String str1 = "test1";
String str2 = "test1";
System.out.println(str1.equals(str2));//Ergebnis 1
System.out.println(str1 == str2); //Ergebnis 2
}
Ergebnis 1 ist natürlich wahr, aber was ist mit Ergebnis 2? Zusammenfassend ist auch Ergebnis 2 wahr.
Dies liegt daran, dass es einen Mechanismus gibt, der als konstanter Pool bezeichnet wird. Zeichenliterale erscheinen häufig im Programm. Wenn Sie jedoch jedes Mal eine Instanz von String erstellen, wird viel Speicherplatz benötigt.
Wenn dasselbe Zeichenfolgenliteral erneut angezeigt wird, wird der Verweis auf die Zeichenfolgeninstanz im Speicherbereich für die Konstante "wiederverwendet". Dies ist ein Mechanismus, der als konstanter Pool bezeichnet wird.
Dieser konstante Pool ist nur gültig, wenn Zeichenfolgenliterale verwendet werden. Wenn Sie explizit schreiben, um eine neue Instanz mit dem neuen Operator zu erstellen, wird jedes Mal eine Instanz erstellt, und jede Variable hat eine andere Referenz.
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
}
Sie werden es in einem tatsächlichen Programm nicht sehen, aber seien Sie vorsichtig, da es ein häufiger Auslöser in Java Silver ist.
Sie können die equalsIgnoreCase-Methode verwenden, um die Äquivalenz unabhängig vom Fall zu bestimmen. Ich denke jedoch, dass die Häufigkeit des Auftretens erheblich niedriger ist als die von Gleichen.
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
}
das ist alles
Recommended Posts