[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?

Einführung

Danke für Ihren Besuch. Für die Java-Methode equals () habe ich die Ausführungszeit mit und ohne die folgende Implementierung verglichen, die sofort true zurückgibt, wenn sie identisch sind.

// equals()Identitätsprüfung zu Beginn von
if (this == obj){
	return true;
}

Ikisatsu (Entschuldigung für die Länge)

Ich mache derzeit eine Ausbildung zum neuen Absolventen SE von SIer. Es ist ein bisschen langweilig, weil es auf der Annahme basiert, dass Sie neu in Java sind, aber es macht Spaß. (Obwohl ich ein Gefühl der Krise habe, muss ich in der Lückenzeit selbst ein wenig für mich selbst lernen ...)

Jetzt führen wir im Training Entwicklungsübungen durch. Es ist wie eine Projekterfahrung wie Einheit, Integrationstest, Erstellung eines internen Konstruktionsdokuments (Komponentenspezifikation) und Codierung basierend auf dem erstellten externen Konstruktionsdokument.

Im internen Entwurf wird das Methodenflussdiagramm so erstellt, dass es basierend auf dem bereits festgelegten Feldnamen und Methodennamen codiert werden kann. Als ich dort anfing, an einer bestimmten DTO-Spezifikation zu arbeiten ** "Überschreibe die equals () -Methode" ** Dort war. Oh, das geht weiter ● Ich habe es gerade in einem Seminar gemacht.

Überschreiben Sie die Methode equals ()

Die equals () -Methode wird in der Object-Klasse wie folgt definiert.

	//Auszug aus dem Java 11-Quellcode
	public boolean equals(Object obj) {
		return (this == obj);
	}

Dies gibt nur die Gleichheit zurück, sodass Sie sie in Ihrer eigenen Klasse ordnungsgemäß implementieren müssen. In diesem Fall wird die Äquivalenz durch die Spezifikationen bestimmt, so dass beispielsweise in der selbst erstellten Klasse Person, selbst wenn das Altersfeld unterschiedlich ist, selbst wenn der Name gleich ist, es frei ist, die Äquivalenz zu beurteilen (wenn Sie dies tun möchten). キャプチャ.PNG

Und hier ist das Hauptthema dieses Artikels. Die Methode equals () prüft zunächst die Identität.

// equals()Identitätsprüfung zu Beginn von(Erneut veröffentlichen)
if (this == obj){
	return true;
}

Das heißt, im Fall von "a.equals (a)" wird true sofort zurückgegeben. Dies ist nicht erforderlich, aber die automatische Generierung von Eclipse sagt, dass es üblich ist, es zu implementieren, da es die Leistung beeinträchtigt. Ohne dies wäre es notwendig zu bestimmen, ob das Feld von a gleich dem Feld von a ist.

Was ist das für ein Prozess?

Als ich ein Flussdiagramm der equals () -Methode erstellte und es dem Ausbilder übermittelte, der die Rolle des PM spielte, erhielt ich den folgenden Kommentar zum entsprechenden Teil der Verarbeitung der Identitätsprüfung. ** "Was ist das für ein Prozess?" ** Bei der Implementierung von equals () dachte ich, es sei ein Prozess, den man einbeziehen sollte, also dachte ich nicht, dass er verwickelt sein würde. Selbst wenn ich es einsetze, kenne ich das Konzept der Identitätsprüfung selbst und wenn ich darauf hinweise, dass "diesmal ein kleiner Maßstab ist, so dass eine strikte Verarbeitung nicht erforderlich ist", kann ich nicht anders, als "ich kenne eine solche Verarbeitung selbst auf dem Gebiet nicht Es macht keinen Sinn, weil ich es nicht gesehen habe und die zurückgegebenen Ergebnisse gleich sind. " Natürlich war ich bis vor kurzem Student und wusste nichts über die Site, also gibt es vielleicht keine Identitätsprüfung auf der Welt ...? Ich wurde misstrauisch und dachte, dass dies nur ein Dummkopf wäre, redundante Logik zu schreiben, also schrieb ich diesen Artikel. Wenn ich vorerst die Vorteile der Ausführungszeit nutzen kann, werde ich gewinnen (gezwungen).

Umgebung

Windows10 Eclipse

Methode

Verwenden Sie die folgende Person.java. Ursprünglich musste die Methode equals () der Object-Klasse überschrieben werden, aber zum Vergleich haben wir equalsWithSelfCheck () mit einer Identitätsprüfung und die Methode equalsWithoutSelfCheck () ohne Identitätsprüfung erstellt und verglichen. Beide basieren auf der von Eclipse automatisch generierten equals () -Methode.

Person.java


public class Person {

	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public boolean equalsWithoutSelfCheck(Object obj) {
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public boolean equalsWithSelfCheck(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}

Darüber hinaus wird die Differenz in der Ausführungszeit unter den gleichen Bedingungen im folgenden Main ausgegeben. Es wurde 10 mal wiederholt gemessen.

Main.java


public class Main {

	public static void main(String[] args) {
		ArrayList<Person> list = new ArrayList<>();
		Person person = new Person("Taro", 20);

		//Eine Liste, die alle dieselbe Person enthält
		for(int i = 0; i < 10000000; i++) {
			list.add(person);
		}

		for (int i = 0; i < 10; i++) {
			long time1 = 0;
			long time2 = 0;

			for (Person p : list) {
				long start = System.nanoTime();
				person.equalsWithoutSelfCheck(p);
				long end = System.nanoTime();
				time1 = time1 + end - start;
			}

			for (Person p : list) {
				long start = System.nanoTime();
				person.equalsWithSelfCheck(p);
				long end = System.nanoTime();
				time2 = time2 + end - start;
			}

			System.out.println("Ausführungszeitunterschied:" + (time1 - time2) * 0.000001 + "Millisekunde");
		}
	}
}


Ergebnis

Ausführungszeitunterschied: 7.8233999999999995 Millisekunden
Ausführungszeitunterschied: 5.2443 Millisekunden
Ausführungszeitunterschied: 3.8985 Millisekunden
Ausführungszeitunterschied: 4.9727 Millisekunden
Ausführungszeitunterschied: 5.5971 Millisekunden
Ausführungszeitunterschied: 2.7468 Millisekunden
Ausführungszeitunterschied: 10.9687 Millisekunden
Ausführungszeitunterschied: 5.1853 Millisekunden
Ausführungszeitunterschied: 5.4607 Millisekunden
Ausführungszeitunterschied: 3.6744 Millisekunden

In beiden Fällen ergab die Methode einschließlich der Identitätsprüfung schnellere Ergebnisse. Es gibt einige Variationen. Da die Ausführungsreihenfolge die Ursache sein kann, habe ich versucht, die Reihenfolge zu ändern, aber die Ausführungszeitdifferenz wurde negativ und die gleiche Schlussfolgerung wurde gezogen.

Apropos

Ich habe auch Fälle ausprobiert, in denen der Inhalt der Liste derselbe ist, aber nicht derselbe wie unten gezeigt.

		//Alle Elemente haben den gleichen Wert(Nicht das gleiche)aufführen
		for(int i = 0; i < 10000000; i++) {
			list.add(new Person("Taro", 20));
		}

Infolgedessen gab es keinen durchschnittlichen Unterschied in der Ausführungszeit, wie unten gezeigt.

Ausführungszeitunterschied: 3.5603 Millisekunden
Ausführungszeitunterschied:-0.223 Millisekunden
Ausführungszeitunterschied: 1.0935 Millisekunden
Ausführungszeitdifferenz: 0.5618 Millisekunden
Ausführungszeitunterschied:-0.006999999999999999 Millisekunden
Ausführungszeitunterschied:-1.4681 Millisekunden
Ausführungszeitunterschied:-0.8628 Millisekunden
Ausführungszeitunterschied: 1.5103 Millisekunden
Ausführungszeitunterschied:-1.9932999999999998 Millisekunden
Ausführungszeitdifferenz: 0.3394 Millisekunden

Daraus wurde bestätigt, dass die Identitätsprüfung in der equals () -Methode ausreichend zur Leistung beiträgt.

Fazit

Es wurde bestätigt, dass die Identitätsprüfung in der Methode equals () ausreichend zur Leistung beitrug, und es stellte sich als nützliche Implementierung heraus. (Mein Gewinn (?))

schließlich

Bis zum Ende Danke fürs Lesen. Wenn Sie Fragen haben, lassen Sie es uns bitte wissen und geben Sie uns Ihre Anleitung.

Recommended Posts

[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Was ist die Hauptmethode in Java?
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Statische Funktion, um zu überprüfen, ob der RGB-Fehler von BufferdImage innerhalb des angegebenen Verhältnisses in Java liegt
[Java] Behandlung von Java Beans in der Methodenkette
Die Reihenfolge der Java-Methodenmodifikatoren ist festgelegt
[Java] Wo befindet sich die Implementierungsklasse der Annotation, die in BeanValidation vorhanden ist?
Ist es Mainstream, das schließende Tag des <P> -Tags nicht in Javadoc zu schreiben?
[Java] Implementierungsmethoden-Memo zum Festlegen des WS-Security-Benutzernamens-Tokens im SOAP-Stub von axis2
Java-Implementierung von Tri-Tree
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
Einfache Möglichkeit, die Methoden- / Feldliste in Java REPL zu überprüfen
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
So leiten Sie den letzten Tag des Monats in Java ab
[Ruby] Denken, wenn sich vor der Methode kein Empfänger befindet (wie es aussieht)
Implementierung einer ähnlichen Funktion in Java
Rufen Sie die Super-Methode in Java auf
Es reagiert nicht auf die Beschreibung in .js der Packs-Datei
[Anmerkung] Java: Ist es notwendig, Gleichheit für die Beurteilung der Gleichheit zu überschreiben?
So überprüfen Sie den Inhalt der Java-Zeichenfolge mit fester Länge
Untersuchungsmethode, wenn die CPU des Servers, auf dem Java ausgeführt wird, schwer ist
So ermitteln Sie die Länge einer Audiodatei mit Java
So erhöhen Sie den Wert von Map in einer Zeile in Java
Speicherort der Methodendefinition Zusammenfassung der zu überprüfenden Informationen Wenn im Projekt und in Rails / Gem definiert
Stellen Sie die Sensorinformationen von Raspberry Pi in Java grafisch dar und überprüfen Sie sie mit einem Webbrowser
[Java-Anfänger] Konvertierung von Zeichenfolge in numerischen Wert - Was ist die parseInt-Methode der Integer-Klasse? ~
Meine Gedanken zur Equals-Methode (Java)
Holen Sie sich das Ergebnis von POST in Java
So machen Sie den Einzug zu zwei Einzelbyte-Leerzeichen in der JAXB-Implementierung des JDK
Überprüfen Sie den Inhalt des Java-Zertifikatspeichers
Java-Referenz zum Verständnis in der Abbildung
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
[Java Servlet] Die Straße von Senri ist auch ein Schritt zum ersten
Die Identität der Schienenparameter [: id]
Anmerkung: [Java] Überprüfen Sie den Inhalt des Verzeichnisses
Anmerkung: [Java] Wenn sich eine Datei im überwachten Verzeichnis befindet, verarbeiten Sie sie.
Rufen Sie den Typ eines Elements eines Arrays ab, um festzustellen, ob es sich um ein Array handelt
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
Vergleich der Thread-Implementierungsmethoden in Java und der Lambda-Ausdrucksmethode
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So erhalten Sie das Datum mit Java
Ausgabe des Buches "Einführung in Java"
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
[Java] Geben Sie das Ergebnis von ffprobe -show_streams in JSON aus und ordnen Sie es einem Objekt in Jackson zu
Ab Java9 werden Klassenkonstruktoren, die primitiven Typen entsprechen, als veraltet markiert.
Die Geschichte des Schreibens von Java in Emacs
Android-Entwicklung, wie man den Wert des JSON-Objekts auf null überprüft
[Java] Überprüfen Sie die Anzahl der Zeichen
[Java] Überprüfen Sie, ob die Zeichenfolge nur aus Leerzeichen besteht (= Leerzeichen)
Was ist CHECKSTYLE: OFF in der Java-Quelle? Checkstyle zu wissen von
Ist es möglich, die Bibliothek (aar) in die Android-Bibliothek (aar) zu stellen und zu verwenden?
Als ich eine Methode für Premium Friday erstellen wollte, war sie bereits in der Java 8-Standard-API enthalten
Ich habe die Daten der Reise (Tagebuchanwendung) in Java erhalten und versucht, sie # 001 zu visualisieren
So überprüfen Sie die neueste Version von io.spring.platform für das Schreiben in pom.xml von Spring (STS)
Fassen Sie den Lebenszyklus von Java-Objekten zusammen, die bei der Android-Entwicklung berücksichtigt werden müssen
AndroidStudio Verweisen wir auf C ++ im Modul anderer Projekte (Java / Kotlin).
Überprüfen Sie das ID-Token eines von AWS Cognito in Java authentifizierten Benutzers
Rufen Sie den ersten Wochentag im aktuellen Gebietsschema ab (welcher Tag ist heute?)