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