[Java] Comprendre la différence entre List et Set

Ce document est une réimpression du matériel créé pour les nouveaux ingénieurs il y a environ 10 ans. Certaines parties démodées telles que l'API et la syntaxe peuvent être perceptibles, mais une fois que vous avez compris l'idée, j'ai l'intention d'organiser les parties de base qui peuvent être utilisées pendant longtemps, donc j'espère que cela sera utile pour les jeunes ingénieurs maintenant.

Point de compréhension

Conditions préalables

Utilisez la classe User implémentée dans equals and hashCode. La méthode Object # toString () est remplacée pour afficher l'état de l'objet.

User.java


    class User {

        /** ID */
        private int id;

        /**Nom*/
        private String name;

        /**
         *C'est un constructeur.
         * 
         * @param id ID
         * @nom du paramètre nom
         */
        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }

        // (Abréviation)getter etc.

        /**
         *Renvoie la valeur de hachage de cette classe.
         * 
         * @renvoie la valeur de hachage de cette classe
         */
        public int hashCode() {
            return this.id * 13;
        }

        /**
         *L'instance de cette classe et l'objet passé en argument
         *Renvoie vrai s'ils sont égaux.
         *L'objet passé en argument est une instance de la classe User
         *Si les valeurs id sont égales, elles sont considérées comme égales.
         *
         * @Vrai si l'objet passé dans l'argument de retour est une instance de la classe User et que les identifiants sont égaux.
         */
        public boolean equals(Object other) {

            if (this == other) { //Vrai si l'objet passé dans l'argument était cet objet lui-même
                return true;
            }

            if (!(other instanceof User)) { //L'objet passé en argument est un objet de la classe User
                return false;               //Faux sinon.
            }

            User otherUser = (User) other;
            if (this.id == otherUser.getId()) { //Comparez les valeurs d'ID, vrai si égal, faux si différent.
                return true;
            }
            return false;
        }

        /**
         *Une représentation sous forme de chaîne d'une instance de cette classe.
         * 
         * @return Une représentation sous forme de chaîne d'une instance de cette classe.
         */
        public String toString() {
            return "User : id = " + id + " name = " + name;
        }
    }

À propos de la différence entre List et Set

Lorsqu'un élément est ajouté à une classe qui implémente l'interface List

--Garantit l'ordre dans lequel les éléments sont ajoutés. En d'autres termes, vous pouvez obtenir les éléments en spécifiant l'index dans l'ordre de add ().

Lorsqu'un élément est ajouté à une classe qui implémente l'interface Set

Exemple d'ajout d'éléments en double à la liste

Jugez l'équivalence en fonction de la valeur de l'id (retourne true si les valeurs de l'id sont égales dans la méthode equals) Ajoutez une instance de la classe User à ArrayList comme indiqué ci-dessous et affichez l'élément ajouté en tant que sortie standard sous forme de chaîne de caractères. Alors ...

    User user1 = new User(1, "Maekawa");
    User user2 = new User(2, "Suzuki");
    User user3 = new User(3, "Maekawa");
    User user4 = new User(1, "Sato"); //L'ID est dupliqué avec l'utilisateur1

    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("Utilisateur dans userList: " + user); //Sortie du contenu de l'appel de la méthode toString
    }

Le résultat de sortie est le suivant. Il est produit dans l'ordre dans lequel les éléments sont ajoutés et les éléments en double sont conservés.

    *****************************************
Utilisateur dans userList: User : id = 1 name =Maekawa
Utilisateur dans userList: User : id = 2 name =Suzuki
Utilisateur dans userList: User : id = 3 name =Maekawa
Utilisateur dans userList: User : id = 1 name =Sato
    *****************************************

Exemple d'ajout d'éléments dupliqués à Set

Jugez l'équivalence en fonction de la valeur de l'id (retourne true si les valeurs de l'id sont égales dans la méthode equals) Ajoutez une instance de la classe User à HashSet comme indiqué ci-dessous et affichez l'élément ajouté en tant que sortie standard sous forme de chaîne de caractères. Alors ...

    User user1 = new User(1, "Maekawa");
    User user2 = new User(2, "Suzuki");
    User user3 = new User(3, "Maekawa");
    User user4 = new User(1, "Sato"); //L'ID est dupliqué avec l'utilisateur1

    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("Utilisateur dans userSet: " + user); //Sortie du contenu de l'appel de la méthode toString
    }

Le résultat de sortie est le suivant. Il n'est pas émis (non garanti) dans l'ordre dans lequel les éléments sont ajoutés et les éléments en double ne sont pas conservés.

    *****************************************
Utilisateur dans userSet: User : id = 3 name =Maekawa
Utilisateur dans userSet: User : id = 2 name =Suzuki
Utilisateur dans userSet: User : id = 1 name =Maekawa
    *****************************************

Sujets en évolution

Qu'est-ce que la duplication en premier lieu?

En premier lieu, "Set" en Java est une expression abstraite du concept de Set en mathématiques.

Chaque élément contenu dans un ensemble est unique.

Autrement dit, les éléments contenus dans le même ensemble ne peuvent pas être considérés comme identiques (valeur égale).

Exprimer cela en Java

Il n'a pas de paire d'éléments e1 et e2 qui est e1.equals (e2). Peut être exprimé comme. Dans une collection telle que Set ou List en Java, les «éléments qui se chevauchent» ne sont rien d'autre que des éléments multiples qui renvoient true comme valeur de retour lors de la comparaison de deux éléments (objets) avec la méthode equals.

Puisque la méthode equals doit être implémentée par le programmeur (sauf si vous utilisez la méthode equals par défaut définie dans la classe Object), les règles pour les objets "dupliqués" en Java varient en fonction des règles métier de l'application et de l'implémentation du programmeur. Cela signifie qu'il peut être défini par la méthode.

Les éléments détenus par Set diffèrent selon la manière dont la méthode equals est implémentée.

Dans l'exemple précédent, l'équivalence de l'instance de classe User était jugée par la valeur de "ID".

Que se passe-t-il lorsqu'une instance de la classe User est ajoutée à l'ensemble si elle est implémentée de telle sorte que l'équivalence de l'instance de la classe User est jugée par la valeur de "nom"?

User.java



        //Exemple d'implémentation de la classe User qui juge l'équivalence par la valeur du nom
        // (Cependant, pour des raisons pratiques, null n'est pas stocké dans la valeur de nom.)

        /**
         *Renvoie la valeur de hachage de cette classe.
         * 
         * @renvoie la valeur de hachage de cette classe
         */
        public int hashCode() {
            return this.name.hashCode();
        }

        /**
         *L'instance de cette classe et l'objet passé en argument
         *Renvoie vrai s'ils sont égaux.
         *L'objet passé en argument est une instance de la classe User
         *Si les valeurs de name sont égales, elles sont considérées comme égales.
         *
         * @True si l'objet passé dans l'argument de retour est une instance de la classe User et que les noms sont égaux.
         */
        public boolean equals(Object other) {

            if (this == other) { //Vrai si l'objet passé dans l'argument était cet objet lui-même
                return true;
            }

            if (!(other instanceof User)) { //L'objet passé en argument est un objet de la classe User
                return false;               //Faux sinon.
            }

            User otherUser = (User) other;
            if (this.name.equals(otherUser.getName())) { //Comparez les valeurs de name, true si égal, false sinon égal. Retourner vrai;
            }
            return false;
        }

Jugez l'équivalence par la valeur de name (retournez true si les valeurs id sont égales dans la méthode equals) Ajoutez une instance de la classe User à HashSet comme indiqué ci-dessous et affichez l'élément ajouté en tant que sortie standard sous forme de chaîne de caractères. Alors ...

    *****************************************
Utilisateur dans userSet: User : id = 1 name =Sato
Utilisateur dans userSet: User : id = 2 name =Suzuki
Utilisateur dans userSet: User : id = 1 name =Maekawa
    *****************************************

plus loin

Vérifiez s'il vous plaît

Recommended Posts

[Java] Comprendre la différence entre List et Set
[iOS] Comprendre la différence entre le cadre et les limites
Comprenez la différence entre les classes abstraites et les interfaces!
[Java] Différence entre == et égal
Différence entre List et ArrayList
Comprendre la différence entre int et Integer et BigInteger en java et float et double
[JAVA] Quelle est la différence entre interface et abstract? ?? ??
Trouvez la différence entre les types de liste
[Java] Différence entre Hashmap et HashTable
[JAVA] Différence entre abstrait et interface
[Java] Différence entre array et ArrayList
[Java] Différence entre fermable et fermable automatiquement
[Java] Différence entre StringBuffer et StringBuilder
[Java] Différence entre longueur, longueur () et taille ()
Différence entre Java et JavaScript (comment trouver la moyenne)
[Java] Vérifiez la différence entre orElse et orElseGet avec IntStream
Différence entre final et immuable en Java
[Pour les débutants] Différence entre Java et Kotlin
[Java 7] Divisez la liste Java et exécutez le processus
À propos de la différence entre irb et pry
Différence entre les listes d'arry et les listes liées en Java
[Java] Différence entre la plage Intstream et la plageClosed
Différence entre int et Integer en Java
[Java] Quelle est la différence entre form, entity et dto? [Haricot]
Facile à comprendre la différence entre la méthode d'instance Ruby et la méthode de classe.
[Rails / Active Record] À propos de la différence entre créer et créer!
Différence entre next () et nextLine () dans Java Scanner
Quelle est la différence entre SimpleDateFormat et DateTimeFormatter? ??
Résumer les différences entre l'écriture C # et Java
Différence entre vh et%
[Java] Différence entre "variable finale" et "objet immuable"
Différence entre i ++ et ++ i
[Ruby] J'ai réfléchi à la différence entre each_with_index et each.with_index
[Rails] J'ai étudié la différence entre les ressources et les ressources
[Java] Trier la liste à l'aide de flux et d'expressions lambda
Quelle est la différence entre System Spec et Feature Spec?
Différences entre les classes et les instances dans Ruby
[Java] Différence entre statique final et final dans les variables membres
[Rails] Quelle est la différence entre la redirection et le rendu?
Comparez la différence entre dockerfile avant et après docker-slim
Classes et instances Java comprises dans la figure
Quelle est la différence entre ignorer et en attente? [RSpec]
[Swift] UITextField m'a appris la différence entre nil et ""
[Java débutant] Différence entre la longueur et la longueur () ~ Je ne sais pas ~
Différence entre produit et variante
Différence entre redirect_to et render
Différence entre redirect_to et render
Différence entre CUI et GUI
Différence entre les variables et les variables d'instance
Différence entre mockito-core et mockito-all
Différence entre classe et instance
Différence entre l'installation de bundle et de bundle
Différence entre ArrayList et LinkedList
Différence entre render et redirect_to
java Generics T et? Différence