Detaillierte Erklärung und Unterschied zwischen Java vergleichbar und vergleicher
Java bietet uns zwei Vergleichsmechanismen: Vergleichbar und Vergleicher. Was ist der Unterschied zwischen ihnen? Lassen Sie uns noch heute herausfinden.
Vergleichbare natürliche Sortierung
Vergleichbar ist eine Schnittstelle unter dem Java.lang -Paket, und es gibt nur eine Methode, die sich im Inneren vergleiche ():
public interface vergleichbar <t> {public int vergleicheto (t o);}Vergleichbar ermöglicht Objekte der Klasse, die implementiert, dass sie verglichen werden. Die spezifischen Vergleichsregeln werden gemäß den Regeln in der Vergleichsmethode durchgeführt. Diese Reihenfolge heißt natürliche Ordnung.
Es gibt drei Fälle, in denen der Rückgabewert der Vergleichsmethode lautet:
Beachten:
1. Da Null keine Klasse oder ein Objekt ist, sollten Sie beim Umschreiben der Vergleichsmethode auf den Fall von E.ComPareto (NULL) achten. Auch wenn E.Equals (NULL) False zurückgibt, sollte die Vergleichsmethode eine Null -Zeiger -Ausnahme -NullPointerexception aktiv werfen.
2. Bei der Implementierung der vergleichbaren Klasse, um die Vergleichsmethode neu zu schreiben, muss das Ergebnis von e1.comPareto (E2) == 0 im Allgemeinen mit E1.Equals (E2) übereinstimmen. Auf diese Weise kann die Reihenfolge gespeicherter Daten in Zukunft in Zukunft bei Verwendung von SortEdSet- und anderen Sammlungsbehältern sortiert werden, um mit der Vorstellungskraft übereinzustimmen.
Einige Leute sind vielleicht neugierig, was passieren wird, wenn der zweite Punkt oben verletzt wird?
Wenn Sie beispielsweise zwei Objekte A und B zu einem sortierten, erfüllen AB (! A.equals (b) && A. compareto (b) == 0), und es gibt keinen anderen Komparator, wenn Sie A hinzufügen, und dann ist es falsch, und die Größe des sortierten Sortiers wird nicht zulässig, und die Duplikation ist nicht zulässig.
Tatsächlich stimmen die Ergebnisse aller Java -Kernklassen, die die vergleichbare Schnittstelle implementieren, mit der Equalas -Methode überein.
List oder Arrays, die die vergleichbare Schnittstelle implementieren, können mit den Methoden collects.sort () oder arrays.sort () sortiert werden.
Nur Objekte, die die vergleichbare Schnittstelle implementieren, können direkt als Schlüssel von SortEdMap (sortiert) verwendet werden, andernfalls müssen die Vergleichssortierregeln außerhalb angegeben werden.
Wenn Sie daher bestellte Sammlungsklassen für die Klasse verwenden möchten, die Sie selbst definieren, müssen Sie die vergleichbare Schnittstelle implementieren, z. B.:
** * Beschreibung: Das für das Testen verwendete Entitätsklassenbuch implementiert die vergleichbare Schnittstelle, natürliche Sortierung * <br/> * Autor: Shixinzhang * <br/> * Daten: 05.01.2016 */Public Class BookBean Implements Serialisierbar, vergleichbar {privater Zeichenfolge Name; private Int Count; public bookBean (Zeichenfolge Name, int count) {this.name = name; this.count = count; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public int getCount () {return count; } public void setCount (int count) {this.count = count; } / ** * Schreiben Sie Equals * @param o * @return * / @Override public boolean Equals (Objekt o) {if (this == o) return true; if (! (o Instanz der Buchbean)) return false; BookBean bean = (bookBean) o; if (getCount ()! = bean.getCount ()) return false; return getName (). Equals (Bean.getName ()); } /*** Schreiben Sie die Berechnungsmethode von HashCode* Iterative Berechnung basierend auf allen Attributen um zu vermeiden. Es ist eine Primzahl und kann nicht erneut geteilt werden * @return */ @Override public int HashCode () {// Aufrufen von String's HashCode (), der nur den Inhalt eines String -Int -Ergebniss = getName (). HashCode () darstellt; // Multiplizieren Sie mit 31, plus Count -Ergebnis = 31 * Ergebnis + getCount (); Rückgabeergebnis; } @Override public String toString () {return "bookBean {" + "name = '" + name +'/'' + ", count =" + count + '}'; } / ** * Beim Hinzufügen von BookBohnen zu Treeset wird diese Methode zum Sortieren * @param ein anderes * @return * / @Override public int vergleicheto (Object Another) {if (eine andere Instanz von BookBean) {bookBean otherbook = (bookBean) ein anderer aufgerufen; int Ergebnis; // Zum Beispiel das Sortieren nach Buchpreis hier result = getCount () - otherbook.getCount (); // oder befolgen Sie die Reihenfolge der Vergleichs // result = getName (). Vergleicheto (otherbook.getName ()); if (result == 0) {// Wenn der Buchpreis gleich ist, vergleichen Sie den Titel. Stellen Sie sicher, dass alle Attribute verglichen werden. } Rückgabeergebnis; } // zurücksenden 0 return 0; }Der obige Code hat auch die Methoden Equalas () und HashCode () neu geschrieben. Benutzerdefinierte Klassen müssen diese Methoden neu geschrieben, wenn sie sie vergleichen möchten.
Wenn Sie den Vergleich später neu schreiben, müssen Sie beurteilen, ob ein bestimmtes Attribut das gleiche ist, und alle Attribute einmal vergleichen.
Die vergleichbare Schnittstelle ist Teil des Java -Sammlungs -Frameworks.
Vergleichsspezifische Sortierung
Comparator ist auch eine Schnittstelle unter dem Java.util -Paket. Vor JDK 1.8 gab es nur zwei Methoden:
public interface vergleicher <t> {public int compare (t lhs, t rhs); öffentlicher Boolescher gleich (Objektobjekt);}JDK 1.8 wurden viele neue Methoden hinzugefügt:
Grundsätzlich sind sie alle mit der Funktion zusammenhängen, und die neuen Ergänzungen zu 1,8 werden hier nicht eingeführt.
Aus dem obigen Punkt können wir erkennen, dass die Verwendung natürlicher Sortierung Klassen erfordert, um vergleichbar zu implementieren, und die Vergleichsmethode wird intern neu geschrieben.
Der Komparator legt die Sortierregeln extern fest und übergibt sie an bestimmte Klassen als Sortierrichtlinienparameter, wie z.
Wie man es benutzt, ist hauptsächlich in drei Schritte unterteilt:
1. Erstellen Sie eine Implementierungsklasse für eine Komparatorschnittstelle und weisen Sie einem Objekt einen Wert zu
Schreiben Sie Sortierregeln für benutzerdefinierte Klassen in der Vergleichsmethode
2. Übergeben Sie das Komparatorobjekt als Parameter an eine Methode der Sortierklasse
3. Fügen Sie eine benutzerdefinierte Klasse hinzu, die in der Vergleichsmethode mit der Sortierklasse verwendet wird
Zum Beispiel:
// 1. Erstellen Sie ein Objekt, das den Vergleicher -Schnittstellen -Vergleich implementiert. NewbookBean NewBookBean1 = (NewBookBean) Object2; // Siehe Vergleiche in der natürlichen Sortierung für die spezifische Vergleichsmethode. } return 0; }}; // 2. Übergeben Sie dieses Objekt als formalen Parameter an den Konstruktor von Treeset Treeset = New Treeset (Comparator); // 3. Fügen Sie das Objekt der in der Vergleichsmethode in Schritt 1 entworfenen Klasse mit dem Treeset zum Treeset theeset.add (NewBookBean ("A", 34)) hinzu; treeset.add (NewBookBean ("S", 1)); treeset.add (new Newbookbean ("V", 46)); treeset.add (new Newbookbean ("Q", 26));Tatsächlich können wir sehen, dass die Verwendung von Comparator ein Strategiemodell ist. Schüler, die mit dem Strategiemodell nicht vertraut sind, können hier klicken, um anzuzeigen: Strategiemodus: Erfahren Sie mehr über die feste Routine von Online -Romanen.
Ein Verweis auf die Komparatorschnittstelle wird in der Sortierklasse enthalten:
Vergleicher <? Super K> Vergleicher;
Wir können verschiedene implementierende Klassen für benutzerdefinierte Sortierregeln übergeben und verschiedene Sortierstrategien für dieselbe Klasse formulieren.
Zusammenfassen
Zwei Sortiermethoden in Java:
Vergleichbare natürliche Sortierung. (Implementierung der Entitätsklasse)
Comparator ist eine benutzerdefinierte Sortierung. (Wenn die Entitätsklasse nicht geändert werden kann, wird sie direkt auf dem Anrufer erstellt.)
Wenn es gleichzeitig existiert, verwendet es die Vergleichsregeln (benutzerdefinierte Sortierung).
Für einige gewöhnliche Datentypen (z. B. Zeichenfolge, Ganzzahl, doppelt ...) implementieren sie standardmäßig die vergleichbare Schnittstelle und die Vergleichsmethode, die wir direkt verwenden können.
Für einige benutzerdefinierte Klassen müssen sie möglicherweise unterschiedliche Vergleichsstrategien in verschiedenen Situationen implementieren. Wir können eine neue Komparatorschnittstelle erstellen und anschließend eine bestimmte Komparatorimplementierung vergleichen.
Dies ist der Unterschied zwischen vergleichbarem und Vergleicher.
Danke fürs Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!