[Anmerkung] Java: Ist es notwendig, Gleichheit für die Beurteilung der Gleichheit zu überschreiben?

Einführung

Wie im vorherigen Artikel, dem aktuellen Nachschlagewerk (Einführung in Java, das klar verstanden werden kann erwähnt. / dp / B00O0NIW30 / ref = dp-kindle-redirect? _ Encoding = UTF8 & btkr = 1)) Ich lerne Java neu. (Eigentlich habe ich es schon gelesen: erröten :)

Im obigen Nachschlagewerk wird beim Erstellen einer Klasse darauf hingewiesen, die bereits bereitgestellte Methode nicht zu überschreiben und ein unbeabsichtigtes Problem zu verursachen. Ein Beispiel ist die Methode "equals".

Die Methode "equals" ist eine Methode, die bestimmt, ob sie gleichwertig und nicht gleichwertig sind. Gemäß dem Nachschlagewerk bestimmt die "gleich" -Methode der ursprünglich bereitgestellten Objektklasse jedoch, ob sie gleichwertig ist oder nicht, indem sie gleich ist oder nicht. Wenn also das Objekt mit dem Namen equals und das Objekt, das Sie als Argument an equals übergeben, gleich sind, sind die beiden Objekte gleich, oder? Es ist eine Übersetzung, die das Offensichtliche als beurteilt.

Implementierung

Siehe den folgenden Code, um die oben genannte Entscheidungsmethode zu unterstützen: Sonnenbrille: Fügen Sie nach dem Erstellen einer Instanz der Person-Klasse diese zu "ArrayList" hinzu und geben Sie das Löschziel mit einer neuen Instanz an, deren Mitglieder den Mitgliedern der hinzugefügten Instanz entsprechen.

instance.java


import java.util.ArrayList;
import java.util.List;

class Person {
    public String name;
    Person(String name){
        this.name = name;
    }
}
public class instance {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Taro"));
        System.out.println("Nach Zugabe(person) : " + personList.size());
        personList.remove(new Person("Taro"));
        System.out.println("Nach dem Löschen(person) : " + personList.size());
    }
}

Auf den ersten Blick scheint es zu funktionieren, aber das Ergebnis ist, dass das ArrayList-Element nicht entfernt wird.

Ergebnis.java


Nach Zugabe(person) : 1
Nach dem Löschen(person) : 1

Es ist wahr, dass die Mitglieder der Instanz eine äquivalente Beziehung haben, aber wenn die Speicheradresse der Instanz unterschiedlich ist, sollte die Speicheradresse des Mitglieds unterschiedlich sein, so dass beurteilt wird, dass sie nicht äquivalent sind, weil sie nicht gleiche Werte sind. Daher scheint es, dass die ursprüngliche "gleich" -Methode der Objektklasse als "falsch" beurteilt wird.

Daher werden wir, wie eingangs erwähnt, die Methode "equals" überschreiben, um das obige Problem zu beheben.

instance.java


class Man {
    public String name;
    Man(String name){
        this.name = name;
    }
    public boolean equals(Object o){
        if(o == this) return true;
        if(o == null) return false;
        if(!(o instanceof Man)) return false;
        Man man = (Man) o ;
        if(!(this.name.equals(man.name))) return false;
        return true;
    }
}
public class instance {
    public static void main(String[] args) {
        List<Man> manList = new ArrayList<Man>();
        manList.add(new Man("Taro"));
        System.out.println("Nach Zugabe(man) : " + manList.size());
        manList.remove(new Man("Taro"));
        System.out.println("Nach dem Löschen(man) : " + manList.size());
    }
}

Dieses Mal ist die Methode "equals" in der Klasse "Man" vordefiniert. Insbesondere wenn die Vergleichsquelle und das Vergleichszielobjekt denselben Typ haben und die Elemente ("Name") äquivalent sind, wird "wahr" zurückgegeben.

Ergebnis.java


Nach Zugabe(man) : 1
Nach dem Löschen(man) : 0

Ja, es funktioniert jetzt wie oben beschrieben.

Das Überschreiben jedes einzelnen wie oben beschrieben ist jedoch auch ziemlich mühsam. Reicht es nicht aus, das relevante Element zu entfernen, während Sie es wie unten gezeigt mit "for" drehen, ohne es separat zu überschreiben? Denken: Denken:

instancce.java


import java.util.ArrayList;
import java.util.List;

class Person {
    public String name;
    Person(String name){
        this.name = name;
    }
}
public class instance {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<Person>();
        personList.add(new Person("Taro"));

        System.out.println("vor dem Löschen der for-Anweisung(person) : " + personList.size());
        for(int i=0; i<personList.size(); i++){
            Person person = personList.get(i);
            String name = person.name;
            if(name.equals("Taro")){
                personList.remove(person);
            }
        }
        System.out.println("nach dem Löschen der for-Anweisung(person) : " + personList.size());
    }
}

Ergebnis.java


vor dem Löschen der for-Anweisung(person) : 1
nach dem Löschen der for-Anweisung(person) : 0

Für diejenigen, die sagen, dass die Beschreibung der "equals" -Methode redundant ist und es schwierig ist, sie einzeln zu schreiben, wenn Sie "EqualsBuilder" der Bibliothek "commons-lang" verwenden, "wenn alle Mitglieder gleichwertig sind, wird die Instanz ebenfalls als gleichwertig angesehen" Es wird ein Urteil fällen. Ich habe es diesmal nicht versucht, aber die Beschreibungsmethode ist wie folgt.

equalsBuilder.java


import org.apache.commons.lang3.builder.*;

class Man {
    public String name;
    Man(String name){
        this.name = name;
    }
    public boolean equals(Object o){
        return EqualsBuilder.reflectionEquals(this,o);
    }
}

Bonus

Dieses Mal habe ich die Methode zum Angeben eines Elements mit der Anweisung "for" und zum Löschen veröffentlicht. Wenn dies jedoch mit der Anweisung "extended for" geändert wird, tritt ein Fehler mit dem Namen "ConcurrentModificationException" auf. Dieser Fehler wird zurückgegeben, wenn die zu erstellende Sammlung durch "Hinzufügen", "Entfernen" usw. bearbeitet wird, wenn "Iterator" erstellt wird.

Weitere Informationen finden Sie unter den folgenden Links. .. .. (Es ist mühsam zu schreiben ...) https://qiita.com/sig_Left/items/eebea3f88a16dcfa2983 https://teratail.com/questions/16901

Recommended Posts

[Anmerkung] Java: Ist es notwendig, Gleichheit für die Beurteilung der Gleichheit zu überschreiben?
Punkte, die bei Java beachtet werden müssen, sind gleich
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
[Java] Beachten Sie, dass der Fall, in dem gleich ist, falsch ist, aber == ist.
Ist es möglich, Getter / Setter automatisch mit Java Interface zu generieren?
[Für Anfänger] Ruby soll Rubin sein, aber was ist damit?
Beachten Sie, dass Neulinge während der Java-Entwicklung lesbaren Code schreiben müssen
Wenn Sie sshpass von Java mit Shell usw. aufrufen, scheint es notwendig zu sein, einen Pfad zu haben.
[Java] Mit Arrays.asList () zu beachtende Punkte
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
Meine Gewinnnotiz: Einführung von Java in Ubuntu
[Java] Heutzutage ist die erweiterte for-Anweisung nicht ausschließlich für List, nicht wahr?
[Java] Ich möchte es einfacher machen, weil es schwierig ist, System.out.println einzugeben