[Java] Über Objects.equals () und Überprüfung des String-Vergleichs (== und gleich)

Java-Ingenieur Akuma-chan @akumachanit Demo! Heute ist eine Demo, die über String-Vergleich spricht!

Java 1.7 ist da

** Wann sprichst du ** Demo? Akuma-chan hat ** eine Anwendung mit JDK 1.6 bei der Arbeit entwickelt ** (eine Demo, die man in der Ära von Reiwa glauben kann? Aber es ist eine ziemliche Demo, die aktualisiert werden muss!), Aber kürzlich wurde sie aktualisiert. Eine Demo, mit der Sie die Funktionen von 1.7 nutzen können!

Objects Demo mit Objects in der ab 1.7 hinzugefügten Klasse. Es scheint, dass 1.7 im Jahr 2011 veröffentlicht wurde. Ich denke, es gibt viele Leute, die dies lesen und noch keine Ingenieure geworden sind. Es tut mir leid, jetzt darüber zu sprechen. (Solch eine egoistische Demo, die zu dieser Zeit kein Ingenieur war).

Bei Verwendung der "Objects" -Methode "Objects.equals ()" habe ich die Spezifikationen vorerst überprüft. Hier ist eine Demo.

Eine Demo, die in der Objects-Spezifikation wie folgt geschrieben ist.

Diese Klasse (...) enthält null-sichere oder null-tolerante Methoden zum Vergleichen zweier Objekte.

Mit anderen Worten, was bedeutet das?

if(a.equals("test")) { //NullPointerException, wenn a null ist
}

Wenn Sie Code wie diesen schreiben und "a" null ist, tritt "NullPointerExceptioin" auf. Es gibt keine "Gleich" -Methode (oder irgendetwas anderes) in "Null", es ist also eine natürliche Demo. In einem solchen Fall war es notwendig, zuerst die Zeichenfolge zu setzen oder zuerst die Nullprüfung durchzuführen.

if("test".equals(a)) { //Absolut NullPointerException tritt nie auf
}
if(a != null && a.equals("test")) { //Wenn null, überspringen Sie das Urteil
}

Das obige Beispiel kann nicht als Variable verwendet werden, bei der beide "null" sein können, und es ist nicht besonders schön, jedes Mal dasselbe zu schreiben wie im folgenden Beispiel! Objects.equals() Objects.equals () !! das erschien schneidig dort

Objects.equals(a, "test"); //So was

public static boolean equals(Object a, Object b) Gibt true zurück, wenn die Argumente gleich sind, andernfalls false. Daher wird true zurückgegeben, wenn beide Argumente null sind, und false, wenn nur ein Argument null ist. Andernfalls wird die Methode equals des ersten Arguments verwendet, um festzustellen, ob sie gleich sind.

Objects.equals () ist eine Demo, die true zurückgibt, auch wenn beide null sind! Dies ist eine Demo, die mit der oben genannten herkömmlichen Methode nicht durchgeführt werden kann! Nun, es ist so praktisch, "Objects.equals ()", aber was passiert, wenn Sie versuchen, Zeichenfolgen zu vergleichen?

Überprüfung über String-Vergleich

Ich denke, jeder, der Java macht, weiß, dass ** Strings nicht zum Vergleich verwendet werden sollten **! Eine Demo, an die sich Leute, die es nicht wussten, definitiv erinnern und hierher zurückkehren werden. Es ist eine Demo, die Sie nur schwer nutzen können, ohne es zu wissen.

Über den Gleichheitsoperator (==)

Zunächst eine Demo, die sich mit den Java-Spezifikationen für Gleichstellungsoperatoren befasst.

15.21. Equality Operators The equality operators may be used to compare two operands that are convertible (§5.1.8) to numeric type, or two operands of type boolean or Boolean, or two operands that are each of either reference type or the null type. All other cases result in a compile-time error.

(Geeignete Übersetzung) Äquivalenzoperatoren können zwischen "zwei Operanden, die in einen numerischen Typ konvertiert werden können", "zwischen zwei Operanden, die boolesch oder boolesch sind" und "zwischen Operanden, die Referenztyp oder Nulltyp sind" verwendet werden. Andere Muster führen zu einem Fehler bei der Kompilierung.

Da "String" ein Referenztyp ist, eine Demo zum Lesen des Vergleichs zwischen dem Referenztyp und dem "Null" -Typ.

15.21.3. Reference Equality Operators == and != At run time, the result of == is true if the operand values are both null or both refer to the same object or array; otherwise, the result is false.

(Geeignete Übersetzung) Zur Laufzeit ist das Ergebnis von == true, wenn die Werte der beiden Operanden "beide null" oder "beide beziehen sich auf dasselbe Objekt oder Array" sind, andernfalls false. ..

Mit anderen Worten, == ist eine Demo, die überprüft, ob die referenzierten Objekte identisch sind.

Wenn Sie == in String verwenden

Dann eine Demo, um den Code zu sehen, der das == von String tatsächlich vergleicht.

String a = "test";
String b = "test";

System.out.println(a == b);               // true

Das? Kein Problem Demo, oder? ?? ?? Wie wäre es dann mit dieser Demo?

String a = "test";
String b = new String("test");

System.out.println(a == b);               // false

Das? Ist es nicht eine Demo, dass das Ergebnis "falsch" ist, nachdem "b" durch "b" ersetzt wurde? Wie wäre es dann mit dieser Demo?

String a = "test";
String b = "te".concat("st");

System.out.println(a == b);               // false

Dies ist auch eine Demo, die "falsch" wurde!

Der Grund dafür ist, dass in Java ** Zeichenfolgenliteral ** (eine Zeichenfolge in doppelten Anführungszeichen wie "test") ** auf dieselbe Zeichenfolgentypinstanz verweist. **Demo. Mit anderen Worten, unabhängig davon, wie oft Sie "test" zuweisen, wird in der Demo ein Verweis auf dieselbe Instanz vom Typ "String" enthalten sein.

Das erste Beispiel ist also eine Demo, in der so etwas intern geschieht.

String x = new String("test");
String a = x;
String b = x;

System.out.println(a == b);               // true

Dies ist eine leicht verständliche Demo! Da sich sowohl "a" als auch "b" auf "x" beziehen, ist es eine überzeugende Demo, dass "a == b" "wahr" ist.

Warum war es im zweiten und dritten Beispiel nicht gleich? Wenn Sie zum Generieren eines Strings "new String ()" verwenden, wird eine neue Instanz erstellt, auch wenn die Werte identisch sind. ** Demo .. Eine Demo von "concat ()", die auch intern "new String ()" verwendet, um einen neuen String zurückzugeben. (Beachten Sie jedoch, dass concat () die ursprüngliche Instanz so zurückgibt, wie sie ist, wenn die Länge der Argumentzeichenfolge 0 beträgt.)

Dies ist eine Demo, in der Sie nicht == verwenden können, um Zeichenfolgen zu vergleichen. Der Grund dafür ist, dass selbst wenn die zu vergleichenden Werte von ** String ** gleich sind, keine Garantie dafür besteht, dass sie sich auf dieselbe Instanz beziehen ** Demo. Wie können Sie also Zeichenfolgen mit unterschiedlichen Instanzen und demselben Wert überprüfen? !! Hier kommt die Demo der Methode "String # equals ()" ins Spiel! !! !!

String#equals() Die Methode String # equals () ist eine Demo, die den Wert von String überprüft!

String a = "test";
String b = new String("test");

System.out.println(a.equals(b));          // true

In Ordung! Dies ist eine Lösungsdemo! Es ist eine Demo, die an dieser Stelle keiner Erklärung bedarf. Zum Vergleich von String ** String # equals ()! !! Dies ist eine perfekte Demo! !! ** ** ** Die Demo, die zu sein scheint ... erreicht hier endlich das Problem am Anfang.

// String#equals()Unansehnliche Code-Demos, mit denen Sie schreiben müssen
if("test".equals(a)) { //Absolut NullPointerException tritt nie auf
}
if(a != null && a.equals("test")) { //Wenn null, überspringen Sie das Urteil
}

Hmmmm! Die Demo, zu der ich endlich gekommen bin! Hier ist die Produktionsdemo!

Objects.equals () führt eine Nullprüfung durch

Die Demo, die ich am Anfang erwähnt habe, ist, dass "# Objects.equals ()" null "prüft, und wenn Sie" null "vergleichen, wird" true "zurückgegeben!

String a = null;
String b = null;
Objects.equals(a, b); // true -Führt nicht zu NullPointerException

String a = null;
String b = "test";
Objects.equals(a, b); // false -Führt nicht zu NullPointerException

Also eine Demo, die mich wundern ließ. ** Was passiert mit String-Vergleichen? ** ** **

Der Grund, warum ich darüber nachgedacht habe, ist, dass "String # equals ()" eigentlich eine Demo ist, die Werte vergleicht, aber die übergeordnete Klasse "Object" hat "Object # equals ()" ist **. Demo-Vergleich ** referenzierter Instanzen anstelle von Werten. Genauer gesagt, eine Demo, die intern == verwendet.

// Object#equals()
public boolean equals(Object obj) {
    return (this == obj);
}

String # equals () ist eine Demo, die ** Object # equals () `überschreibt und den Prozess neu schreibt **.

Wenn Sie also wissen, dass "Objects # equals ()" "Object" heißt, verhält es sich also genauso wie "Object # equals"? Ich dachte, es wäre eine Demo. Die Antwort ist die Demo, die in den eingangs beschriebenen Methodenspezifikationen beschrieben ist.

~ (Weggelassen) Andernfalls wird die Methode equals des ersten Arguments verwendet, um festzustellen, ob sie gleich sind.

Eine Demo, in der die Methode "equals" ** des ersten Arguments angegeben wird, wenn beide Argumente nicht "null" sind. Mit anderen Worten, wenn Sie dem ersten Argument einen Wert vom Typ "String" übergeben, werden die Werte verglichen. Wenn das erste Argument nicht "String" und das zweite Argument "String" ist, ist es sowieso falsch, sodass der Inhalt der Argument "equals" -Methode eine irrelevante Demo ist.

Zusammenfassung

** Demo mit Objects.equals ()! !! !! ** ** **

Verweise

Offizielles Orakelzeug und dies und Demos.

Recommended Posts

[Java] Über Objects.equals () und Überprüfung des String-Vergleichs (== und gleich)
[Java] Über String und StringBuilder
[Java] Der verwirrende Teil von String und StringBuilder
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
[Java] Vergleich von Zeichenketten und && und ||
Informationen zur Java String-Klasse
NIO Bewertung von Java
Der Vergleich von enum ist == und gleich ist gut [Java]
[Java] Umgang mit Zeichenketten (String-Klasse und StringBuilder-Klasse)
Über Java-Instanzen
[Java] Unterschied zwischen == und gleich
[Java Silver] Über gleich Methode
[Java] HashCode und gleich Überschreibung
Vor- und Nachteile von Java
Über Java-Paket und Import
[Java] Struktur der Auflistungsklasse festlegen (zu HashSet und TreeSet)
Empfehlung der Set-Operation durch Java (und Verständnis von Equals und HashCode)
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.
[Java] Geschwindigkeitsvergleich der Zeichenfolgenkombination
Informationen zu statischen und nicht statischen Java-Methoden
Über verschiedene Eindrücke von "Testen von Java Microservices" und Consumer Driven Contract
Verschiedene Methoden der Java String Klasse
Über Lambda, Stream, LocalDate von Java8
Informationen zu den Methoden equals () und hashcode ()
[Java-Anfänger] Über Abstraktion und Schnittstelle
[Java-Anfänger] == Operator und Gleiche Methode
Informationen zur Beziehung zwischen dem Java String Equality Operator (==) und der Initialisierung. Anfänger
Informationen zu removeAll und RetainAll von ArrayList
Verstehe gleich und hashCode in Java
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Informationen zu primitiven Java-Typen und Referenztypen
Java 8 studieren (String Joiner und Join)
[Java] Korrekter Vergleich des String-Typs
Dies und das über Base64 (Java)
Über die Klassifizierung und das Konzept von Immutable / Mutable / Const / Variable von Java und Kotlin.
Überprüfung von "seltsamem Java" und Java-Wissen, das in Java Bronze oft vergessen wird
Informationen zur Funktionsweise von next () und nextLine ()
[Über JDBC, das Java und SQL verbindet]
[Java / Swift] Vergleich von Java-Schnittstelle und Swift-Protokoll
[Java-Anfänger] Informationen zur Initialisierung eines mehrdimensionalen Arrays
[Grundkenntnisse in Java] Informationen zur Typkonvertierung
Zusammenfassung von Java Math.random und Import (Kalender)
[Java] Inhalt der Collection-Schnittstelle und der List-Schnittstelle
Diskriminierung von Enum in Java 7 und höher
Java-Zeichenfolge
== und gleich
Java-Überprüfung
Die Geschichte des einfachen String-Vergleichs in Java
Denken Sie an die Kombination von Servlet und Ajax
Informationen zur Beschreibungsreihenfolge der Java-Systemeigenschaften
Lesen Sie den Hinweis zur Dateikopie von Java 1.7 oder höher
[Java] Persönliche Zusammenfassung der Klassen und Methoden (grundlegend)
Informationen zu Java-Datentypen (insbesondere primitiven Typen) und Literalen
[Java] Ermittelt die Länge der Ersatzpaarzeichenfolge