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;
}
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.
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).
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.
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).
Windows10 Eclipse
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");
}
}
}
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.
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.
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 (?))
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