Die festgelegte Schnittstelle in Java hat die folgenden Eigenschaften:
Wiederholte Elemente sind nicht erlaubt;
Die Elemente im Set sind in keiner Reihenfolge;
Es gibt und nur ein Element mit einem Wert von Null.
Da die festgelegte Schnittstelle in Java die mathematische Set -Abstraktion nachahmt, sind die entsprechenden mathematischen Set -Eigenschaften:
Gegenseitiges Geschlecht: In einem Satz werden zwei beliebige Elemente als unterschiedlich angesehen, dh jedes Element kann nur einmal erscheinen.
Störung: In einem Satz hat jedes Element den gleichen Status und ist zwischen den Elementen ungeordnet. Sequentielle Beziehungen können auf einem Satz definiert werden. Nach der Definition der Ordenbeziehungen können die Elemente nach der Ordenbeziehung sortiert werden. In Bezug auf die Eigenschaften des Satzes selbst gibt es jedoch keine notwendige Reihenfolge zwischen den Elementen.
Die Art eines leeren Satzes: Ein leeres Set ist eine Teilmenge aller Sätze
SET speichert keine doppelten Elemente. Der am häufigsten verwendete Satz sind die Testattribute. Sie können leicht fragen, ob sich ein Objekt in einem Satz befindet. SET hat genau die gleiche Schnittstelle wie die Sammlung, sodass keine zusätzliche Funktionalität besteht. Tatsächlich ist SET eine Sammlung, aber das Verhalten ist anders.
Die wichtigsten Dinge, die die festgelegte Schnittstelle implementieren, sind Hashset, Treeset und LinkedHashset. Die gemeinsamen Punkte jedesselben Elements werden nur eine Kopie gespeichert. Sie haben auch Unterschiede, die Unterschiede sind wie folgt:
1.Hashset:
Hashset verwendet eine sehr komplexe Möglichkeit, Elemente zu speichern. Die Verwendung von Hashset kann so schnell wie möglich Elemente in der Sammlung erhalten, was sehr effizient ist (damit der Raum für die Handelszeit). Ob das Pangduan das gleiche Objekt ist, wird basierend auf HashCode und gleichermaßen bestimmt. Wenn der HashCode gleich ist und gleichermaßen die gleichen RECHTS RECHT, ist er dasselbe Objekt und kann nicht wiederholt gespeichert werden.
Paket cn.set; import java.util.hashset; import Java.util.set; Klasse Student {int id; public student (int id) {this.id = id; } @Override public String toString () {return this.id+""; } @Override public int HashCode () {return this.id; } @Override public boolean Equals (Objekt obj) {if (obj Instance von Student) {Student stu = (Student) obj; if (stu.id == this.id) return true; } return false; }} public class Hashsettest {public static void main (String [] args) {set <Studenten> set = new Hashset <Sudest> (); Schüler S1 = neuer Schüler (1); Schüler S2 = neuer Schüler (1); Schüler S3 = neuer Schüler (2); set.add (S1); set.add (s2); set.add (S3); für (Schüler s: set) {System.out.println (s); }}}Wie im obigen Beispiel gezeigt, können nach dem Umschreiben der Methoden von HashCode () und Equals () zur Unterscheidung der Einwilligungsobjekte nicht die gleichen Objekte gespeichert werden. Wenn diese beiden Methoden kommentiert werden, werden alle Studentenobjekte als verschiedene Objekte angesehen und können gespeichert werden.
2. Streeset
Treeset kann keine doppelten Objekte speichern, aber Treeset sortiert automatisch. Wenn die gespeicherten Objekte nicht sortiert werden können, wird ein Fehler gemeldet, sodass die gespeicherten Objekte die Sortierregeln angeben müssen. Zu den Sortierregeln gehören natürliche Sortierung und Kundensortierung.
① Natürliches Sortieren: Das Objekt zum Hinzufügen von Treeset wird die Java.lang.Ch -Schnittstelle auf welcher Objektklasse implementieren und die Vergleiche () -Methode überschreiben. Rückgabe von 0 bedeutet, dass es dasselbe Objekt ist, ansonsten ist es ein anderes Objekt.
②Customer-Sortierung: Erstellen Sie eine Drittanbieterklasse und implementieren Sie die Schnittstelle java.util.comParator. Und schreiben Sie die Methode neu. Definieren Sie die Sammelform Treeset ts = neuer Treeset (neue Drittanbieterklasse ());
Das folgende Beispiel verwendet Treeset, um natürliche sortierte Objekte zu speichern:
Paket cn.set; import Java.util.set; import Java.util.Treeset; Klasse Student1 implementiert vergleichbar <Student1> {int id; public student1 (int id) {this.id = id; } @Override public String toString () {return this.id+""; } @Override public int HashCode () {return this.id; } @Override public boolean Equals (Objekt obj) {if (obj Instance von student1) {student1 stu = (student1) obj; if (stu.id == this.id) return true; } return false; } public int vergleicheto (student1 o) {return (this.id-o.id); }} public class treesettest {public static void main (String [] args) {set <Student1> set = new treeset <Student1> (); Student1 S1 = New Student1 (5); Student1 S2 = neuer Schüler1 (1); Student1 S3 = New Student1 (2); Student1 S4 = New Student1 (4); Student1 S5 = neuer Schüler1 (3); set.add (S1); set.add (s2); set.add (S3); set.add (S4); set.add (s5); für (student1 s: set) {System.out.println (s); }}} Das Ausgangsergebnis ist:
Das folgende Beispiel verwendet Treeset, um Kunden sortierte Objekte zu speichern:
Paket com.set; import java.util.set; import Java.util.Treeset; Klasse student1 implementiert vergleichbar <student1> {int id; public student1 (int id) {this.id = id; } @Override public String toString () {return this.id+""; } @Override public int HashCode () {return this.id; } @Override public boolean Equals (Objekt obj) {if (obj Instance von student1) {student1 stu = (student1) obj; if (stu.id == this.id) return true; } return false; } public int vergleicheto (student1 o) {return (this.id-o.id); }} public class treesettest {public static void main (String [] args) {set <Student1> set = new treeset <Student1> (); Student1 S1 = New Student1 (5); Student1 S2 = neuer Schüler1 (1); Student1 S3 = New Student1 (2); Student1 S4 = New Student1 (4); Student1 S5 = neuer Schüler1 (3); set.add (S1); set.add (s2); set.add (S3); set.add (S4); set.add (s5); für (student1 s: set) {System.out.println (s); }}} Das Ausgangsergebnis ist:
Jeder weiß, dass diese Liste in der Reihenfolge der Einfügung sortiert ist, wenn sie gespeichert werden. Tatsächlich können Sie auch Listenkollektionen nach natürlicher Sortierung und Kundensortierung sortieren. Bitte siehe:
Paket cn.set; import Java.util.ArrayList; import java.util.collections; import java.util.list; class mySort1 implementiert java.util.comParator <Student3> {public int compare (student3 o1, student3 o2) {return o2.id-oid.id; }} class student3 implementiert vergleichbar <student3> {int id; public student3 (int id) {this.id = id; } @Override public String toString () {return this.id+""; } public int vergleicheto (student3 o) {return (this.id-o.id); }} öffentliche Klasse ListSort {public static void main (String [] args) {list <Student3> list = new ArrayList <Studenten3> (); Student3 S1 = neuer Schüler3 (5); Student3 S2 = neuer Schüler3 (1); Student3 S3 = neuer Schüler3 (2); Student3 S4 = New Student3 (4); Student3 S5 = neuer Schüler3 (3); list.add (S1); list.add (s2); list.add (S3); list.add (S4); list.add (s5); System.out.println (Liste); // natürliche Sortierung: Sammlungen.Sort (Liste); System.out.println (Liste); // Kundensortierkollektions.sort (Liste, New Mysort1 ()); System.out.println (Liste); }} Das Ausgangsergebnis ist:
[5, 1, 2, 4, 3]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
Das Folgende ist ein Prinzip, dass die festgelegte Sammlungsschnittstelle in Java keine Duplikation des Einfügen von Objekten implementiert:
In einer Java -Sammlung ist die Regel, um festzustellen, ob zwei Objekte gleich sind,:
1) Bestimmen Sie, ob die Hashcodes der beiden Objekte gleich sind
Wenn es nicht gleich ist, wird berücksichtigt, dass die beiden Objekte nicht gleich sind. Wenn es gleich ist, wenden Sie sich auf 2)
(Dies ist nur erforderlich, um die Speicherungseffizienz zu verbessern. Tatsächlich ist es möglich, theoretisch keine theoretisch zu haben, aber wenn nicht, wird die Effizienz während des tatsächlichen Gebrauchs stark reduziert, sodass wir es hier notwendig machen. Dieses Problem wird später auf dieses Problem konzentriert.)
2) Bestimmen Sie, ob die beiden Objekte gleichermaßen unter Verwendung von Equals berechnet werden
Wenn es nicht gleich ist, denken Sie, dass die beiden Objekte nicht gleich sind. Wenn es gleich ist, denken Sie, dass die beiden Objekte gleich sind (Equals () ist der Schlüssel zu der Beurteilung, ob die beiden Objekte gleich sind)
Für allgemeine Klassenobjekte (außer eingekapselten Objekten wie String):
Wenn die gewöhnliche Klasse die Methoden von HashCode () und Equals () nicht überschreibt, ist die HashCode () -Methode in der vererbten Objektklasse die HashCode () -Methode in der vererbten Objektklasse, die HashCode () -Methode in der Objektklasse ist eine lokale Methode. Beim Vergleich des Rückgabewerts der Methode wird die Objektadresse (Referenzadresse) verglichen. Verwenden Sie die neue Methode, um ein Objekt mit demselben Inhalt zu erstellen. Natürlich werden verschiedene Objekte zweimal generiert. Es sei denn, die Methode von HashCode () wird überschrieben. Die in der Objektklasse definierte Equals () -Methode ist ebenfalls ein Vergleich von Objektadressen. In einem Wort: Wenn Sie die Methoden HashCode () und Equals () nicht umschreiben, sind die Objektreferenzadressen in der SET -Sammlung unterschiedlich und das Objekt wird nicht wiederholt.
Für Objekte wie String (String, Ganzzahl, doppelt ... usw.):
Da diese Einkapselungsklassen selbst die HashCode () -Methode umgeschrieben haben und der Rückgabewert der umgeschriebenen Methode mit dem Inhalt des Objekts, nicht mit der Referenzadresse bezieht. Die Equals () -Methode in diesen eingekapselten Klassen wird ebenfalls umgeschrieben, wobei der Inhalt des Objekts und nicht die Referenzadresse verglichen wird. Kurz gesagt, Objekte von Klassen wie String vergleichen ihre Inhalte in der Sammlung, und wenn derselbe Inhalt überschrieben wird, werden vorhandene Objekte behandelt.
Das Obige dreht sich alles um diesen Artikel, ich hoffe, es wird für das Lernen aller hilfreich sein.