[Java] Verstehe den Unterschied zwischen List und Set

Dieses Dokument ist ein Nachdruck des Materials, das vor etwa 10 Jahren für neue Ingenieure erstellt wurde. Einige altmodische Teile wie API und Syntax mögen auffallen, aber sobald Sie die Idee kennen, beabsichtige ich, die grundlegenden Teile zu organisieren, die für eine lange Zeit verwendet werden können, und hoffe, dass sie jetzt für junge Ingenieure hilfreich sein werden.

Punkt des Verstehens

Voraussetzungen

Verwenden Sie die in [equals and hashCode] implementierte Benutzerklasse (https://qiita.com/yachinco/items/b1a3602d6aa261f5f7c4). Die Object # toString () -Methode wird überschrieben, um den Status des Objekts auszugeben.

User.java


    class User {

        /** ID */
        private int id;

        /**Name*/
        private String name;

        /**
         *Es ist ein Konstruktor.
         * 
         * @param id ID
         * @Param Name Name
         */
        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }

        // (Abkürzung)Getter etc.

        /**
         *Gibt den Hashwert dieser Klasse zurück.
         * 
         * @Rückgabe des Hash-Werts dieser Klasse
         */
        public int hashCode() {
            return this.id * 13;
        }

        /**
         *Die Instanz dieser Klasse und das Objekt wurden als Argument übergeben
         *Gibt true zurück, wenn sie gleich sind.
         *Das als Argument übergebene Objekt ist eine Instanz der User-Klasse
         *Wenn die ID-Werte gleich sind, werden sie als gleich betrachtet.
         *
         * @True, wenn das im return-Argument übergebene Objekt eine Instanz der User-Klasse ist und die IDs gleich sind.
         */
        public boolean equals(Object other) {

            if (this == other) { //True, wenn das im Argument übergebene Objekt dieses Objekt selbst war
                return true;
            }

            if (!(other instanceof User)) { //Das als Argument übergebene Objekt ist ein Objekt der User-Klasse
                return false;               //Falsch wenn nicht.
            }

            User otherUser = (User) other;
            if (this.id == otherUser.getId()) { //Vergleichen Sie die ID-Werte, true wenn gleich, false wenn nicht gleich.
                return true;
            }
            return false;
        }

        /**
         *Eine Zeichenfolgendarstellung einer Instanz dieser Klasse.
         * 
         * @return Eine Zeichenfolgendarstellung einer Instanz dieser Klasse.
         */
        public String toString() {
            return "User : id = " + id + " name = " + name;
        }
    }

Über den Unterschied zwischen List und Set

Beim Hinzufügen eines Elements zu einer Klasse, die die List-Schnittstelle implementiert

Wenn ein Element zu einer Klasse hinzugefügt wird, die die Set-Schnittstelle implementiert

Beispiel für das Hinzufügen doppelter Elemente zur Liste

Beurteilen Sie die Äquivalenz anhand des ID-Werts (geben Sie true zurück, wenn die ID-Werte in der Methode equals gleich sind). Fügen Sie ArrayList eine Instanz der Benutzerklasse hinzu, wie unten gezeigt, und geben Sie das hinzugefügte Element als Standardausgabe als Zeichenfolge aus. Dann ...

    User user1 = new User(1, "Maekawa");
    User user2 = new User(2, "Suzuki");
    User user3 = new User(3, "Maekawa");
    User user4 = new User(1, "Sato"); //ID wird mit user1 dupliziert

    List userList = new ArrayList();
    userList.add(user1);
    userList.add(user2);
    userList.add(user3);
    userList.add(user4);

    for (Iterator userIter = userList.iterator(); userIter.hasNext(); ) {
        User user = (User) userIter.next();
        System.out.println("Benutzer in der Benutzerliste: " + user); //Geben Sie den Inhalt des Methodenaufrufs toString aus
    }

Das Ausgabeergebnis ist wie folgt. Es wird in der Reihenfolge ausgegeben, in der die Elemente hinzugefügt werden, und doppelte Elemente bleiben erhalten.

    *****************************************
Benutzer in der Benutzerliste: User : id = 1 name =Maekawa
Benutzer in der Benutzerliste: User : id = 2 name =Suzuki
Benutzer in der Benutzerliste: User : id = 3 name =Maekawa
Benutzer in der Benutzerliste: User : id = 1 name =Sato
    *****************************************

Beispiel für das Hinzufügen doppelter Elemente zu Set

Beurteilen Sie die Äquivalenz anhand des ID-Werts (geben Sie true zurück, wenn die ID-Werte in der Methode equals gleich sind). Fügen Sie HashSet eine Instanz der Benutzerklasse hinzu, wie unten gezeigt, und geben Sie das hinzugefügte Element als Standardausgabe als Zeichenfolge aus. Dann ...

    User user1 = new User(1, "Maekawa");
    User user2 = new User(2, "Suzuki");
    User user3 = new User(3, "Maekawa");
    User user4 = new User(1, "Sato"); //ID wird mit user1 dupliziert

    Set userSet = new HashSet();
    userSet.add(user1);
    userSet.add(user2);
    userSet.add(user3);
    userSet.add(user4);

    for (Iterator userIter = userSet.iterator(); userIter.hasNext(); ) {
        User user = (User) userIter.next();
        System.out.println("Benutzer in userSet: " + user); //Geben Sie den Inhalt des Methodenaufrufs toString aus
    }

Das Ausgabeergebnis ist wie folgt. Es wird nicht in der Reihenfolge ausgegeben (nicht garantiert), in der die Elemente hinzugefügt werden, und doppelte Elemente werden nicht beibehalten.

    *****************************************
Benutzer in userSet: User : id = 3 name =Maekawa
Benutzer in userSet: User : id = 2 name =Suzuki
Benutzer in userSet: User : id = 1 name =Maekawa
    *****************************************

Sich entwickelnde Themen

Was ist Vervielfältigung überhaupt?

Erstens ist "Set" in Java ein abstrakter Ausdruck des Konzepts von Set in der Mathematik.

Jedes in einem Set enthaltene Element ist einzigartig.

Das heißt, Elemente, die in derselben Menge enthalten sind, können nicht als gleich angesehen werden (gleicher Wert).

Dies in Java ausdrücken

Es gibt keine Elementpaare von e1 und e2, die e1.equals (e2) sind. Kann ausgedrückt werden als. In einer Auflistung wie Set oder List in Java sind "überlappende Elemente" nichts anderes als mehrere Elemente, die beim Vergleich zweier Elemente (Objekte) mit der Methode equals true als Rückgabewert zurückgeben.

Da die Methode equals vom Programmierer implementiert werden muss (es sei denn, Sie verwenden die in der Object-Klasse definierte Standardmethode equals), variieren die Regeln für "doppelte" Objekte in Java in Abhängigkeit von den Geschäftsregeln der Anwendung und der Implementierung des Programmierers. Dies bedeutet, dass es durch die Methode definiert werden kann.

Die von Set gehaltenen Elemente unterscheiden sich je nachdem, wie die Methode equals implementiert ist.

Im vorherigen Beispiel wurde die Äquivalenz der Benutzerklasseninstanz anhand des Werts "ID" beurteilt.

Was passiert, wenn eine Instanz der Benutzerklasse zum Set hinzugefügt wird, wenn sie so implementiert ist, dass die Äquivalenz der Instanz der Benutzerklasse anhand des Werts "name" beurteilt wird?

User.java



        //Implementierungsbeispiel einer Benutzerklasse, die die Äquivalenz anhand des Werts des Namens beurteilt
        // (Der Einfachheit halber wird null jedoch nicht im Wert von name gespeichert.)

        /**
         *Gibt den Hashwert dieser Klasse zurück.
         * 
         * @Rückgabe des Hash-Werts dieser Klasse
         */
        public int hashCode() {
            return this.name.hashCode();
        }

        /**
         *Die Instanz dieser Klasse und das Objekt wurden als Argument übergeben
         *Gibt true zurück, wenn sie gleich sind.
         *Das als Argument übergebene Objekt ist eine Instanz der User-Klasse
         *Wenn die Werte von name gleich sind, werden sie als gleich angesehen.
         *
         * @True, wenn das im return-Argument übergebene Objekt eine Instanz der User-Klasse ist und die Namen gleich sind.
         */
        public boolean equals(Object other) {

            if (this == other) { //True, wenn das im Argument übergebene Objekt dieses Objekt selbst war
                return true;
            }

            if (!(other instanceof User)) { //Das als Argument übergebene Objekt ist ein Objekt der User-Klasse
                return false;               //Falsch wenn nicht.
            }

            User otherUser = (User) other;
            if (this.name.equals(otherUser.getName())) { //Vergleichen Sie die Werte von name, true wenn gleich, false wenn nicht gleich. Geben Sie true zurück;
            }
            return false;
        }

Beurteilen Sie die Äquivalenz anhand des Werts des Namens (geben Sie true zurück, wenn die ID-Werte in der Methode equals gleich sind). Fügen Sie HashSet eine Instanz der User-Klasse hinzu, wie unten gezeigt, und geben Sie das hinzugefügte Element als Standardausgabe als Zeichenfolge aus. Dann ...

    *****************************************
Benutzer in userSet: User : id = 1 name =Sato
Benutzer in userSet: User : id = 2 name =Suzuki
Benutzer in userSet: User : id = 1 name =Maekawa
    *****************************************

des Weiteren

--Was passiert, wenn Sie die Methoden equals und hashCode nicht implementieren? --Was passiert, wenn Sie die Methode equals und nicht die Methode hashCode implementieren?

Bitte prüfen

Recommended Posts

[Java] Verstehe den Unterschied zwischen List und Set
[iOS] Verstehe den Unterschied zwischen Frame und Grenzen
Verstehe den Unterschied zwischen abstrakten Klassen und Schnittstellen!
[Java] Unterschied zwischen == und gleich
Unterschied zwischen List und ArrayList
Verstehen Sie den Unterschied zwischen int und Integer und BigInteger in Java und float und double
[JAVA] Was ist der Unterschied zwischen Schnittstelle und Zusammenfassung? ?? ??
Finden Sie den Unterschied zwischen Listentypen
[Java] Unterschied zwischen Hashmap und HashTable
[JAVA] Unterschied zwischen Abstract und Interface
[Java] Unterschied zwischen Array und ArrayList
[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen StringBuffer und StringBuilder
[Java] Unterschied zwischen Länge, Länge () und Größe ()
Unterschied zwischen Java und JavaScript (wie man den Durchschnitt findet)
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
Unterschied zwischen final und Immutable in Java
[Für Anfänger] Unterschied zwischen Java und Kotlin
[Java 7] Teilen Sie die Java-Liste und führen Sie den Prozess aus
Über den Unterschied zwischen irb und pry
Unterschied zwischen Arrylist und verknüpfter Liste in Java
[Java] Unterschied zwischen Intstream-Bereich und rangeClosed
Unterschied zwischen int und Integer in Java
[Java] Was ist der Unterschied zwischen Form, Entität und dto? [Bohne]
Der Unterschied zwischen der Ruby-Instanzmethode und der Klassenmethode ist leicht zu verstehen.
[Rails / Active Record] Über den Unterschied zwischen create und create!
Unterschied zwischen next () und nextLine () in Java Scanner
Was ist der Unterschied zwischen SimpleDateFormat und DateTimeFormatter? ??
Fassen Sie die Unterschiede zwischen C # - und Java-Schrift zusammen
Unterschied zwischen vh und%
[Java] Unterschied zwischen "endgültiger Variable" und "unveränderlichem Objekt"
Unterschied zwischen i ++ und ++ i
[Ruby] Ich habe über den Unterschied zwischen each_with_index und each.with_index nachgedacht
[Rails] Ich habe den Unterschied zwischen Ressourcen und Ressourcen untersucht
[Java] Sortieren Sie die Liste mit Streams und Lambda-Ausdrücken
Was ist der Unterschied zwischen Systemspezifikation und Funktionsspezifikation?
Unterschiede zwischen Klassen und Instanzen in Ruby
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
[Rails] Was ist der Unterschied zwischen Redirect und Rendering?
Vergleichen Sie den Unterschied zwischen Docker-Datei vor und nach Docker-Slim
In der Abbildung verstandene Java-Klassen und -Instanzen
Was ist der Unterschied zwischen Überspringen und Ausstehend? [RSpec]
[Swift] UITextField hat mir den Unterschied zwischen Null und "" beigebracht.
[Java-Anfänger] Unterschied zwischen Länge und Länge () ~ Ich weiß nicht ~
Unterschied zwischen Produkt und Variante
Unterschied zwischen redirect_to und render
Unterschied zwischen redirect_to und render
Unterschied zwischen CUI und GUI
Unterschied zwischen Variablen und Instanzvariablen
Unterschied zwischen Mockito-Core und Mockito-All
Unterschied zwischen Klasse und Instanz
Unterschied zwischen Bundle und Bundle-Installation
Unterschied zwischen ArrayList und LinkedList
Unterschied zwischen render und redirect_to
Java Generics T und? Unterschied