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.
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);
}
}
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