Heim  >  Artikel  >  Java  >  So verwenden Sie die Java-Methode equal()

So verwenden Sie die Java-Methode equal()

青灯夜游
青灯夜游Original
2023-01-06 14:42:109096Durchsuche

In Java wird die Methode equal() verwendet, um zu erkennen, ob ein Objekt einem anderen Objekt entspricht. Die Syntax lautet „Object.equals(Object2)“. Diese Methode bestimmt, ob zwei Objekte dieselbe Referenz haben haben die gleichen Referenzen, müssen sie gleich sein. Die Methode equal() kann nicht mit Variablen grundlegender Datentypen arbeiten.

So verwenden Sie die Java-Methode equal()

Die Betriebsumgebung dieses Tutorials: Windows7-System, Java8-Version, DELL G3-Computer.

Java-equals()-Methode bestimmt, ob Objekte gleich sind.

equals-Methode wird verwendet, um zu erkennen, ob ein Objekt einem anderen Objekt gleich ist. Hinweis: Die Methode „equals“ kann nicht auf Variablen grundlegender Datentypen angewendet werden. In der Klasse „Object“ bestimmt diese Methode, ob zwei Objekte dieselbe Referenz haben.

Aus dieser Sicht ist es sinnvoll, dies zum Standardvorgang zu machen. Für die meisten Klassen ist dieses Urteil jedoch nicht sinnvoll. Beispielsweise ist es völlig bedeutungslos, zwei PrintStreams auf diese Weise zu vergleichen. Allerdings ist es oft notwendig, die Gleichheit der Zustände zweier Objekte zu erkennen. Wenn die Zustände zweier Objekte gleich sind, werden die beiden Objekte als gleich betrachtet. Daher muss der Gleichheitsvergleich in benutzerdefinierten Klassen überschrieben werden.

Im Folgenden finden Sie Vorschläge zum Schreiben einer perfekten equal()-Methode:

(1) Benennen Sie den expliziten Parameter otherObject, der später in eine Variable namens other umgewandelt werden muss.

(2) Überprüfen Sie, ob dieses und otherObject dasselbe haben Referenz Ein Objekt:

if(this==otherObject) return true;

Diese Anweisung ist nur eine Optimierung. Tatsächlich ist dies eine Form, die oft verwendet wird. Denn die Berechnung dieser Gleichung ist viel kostengünstiger als der einzelne Vergleich der Felder in der Klasse.

(3) Überprüfen Sie, ob otherObject null ist. Wenn es null ist, geben Sie false zurück. Dieser Test ist sehr notwendig.

if(otherObject==null) return false;

(4) Vergleichen Sie dieses und otherObject, um zu sehen, ob sie zur gleichen Klasse gehören. Wenn sich die Semantik von equal in jeder Unterklasse ändert, verwenden Sie getClass(), um es zu erkennen und als Zielklasse zu verwenden.

if(getClass()!=otherObject.getClass()) return false;

Wenn alle Unterklassen vorhanden sind haben die gleiche Semantik, verwenden Sie zum Erkennen von

if(!(otherObject instanceof ClassName)) return false;

die Instanz von (5) Konvertieren Sie otherObject in eine Variable des entsprechenden Typs:

ClassName other=(ClassName)otherObject;

(6) Beginnen Sie nun mit dem Vergleich aller Felder, die verglichen werden müssen. Verwenden Sie ==, um Basistypfelder zu vergleichen, und equal, um Objektfelder zu vergleichen. Wenn alle Felder übereinstimmen, wird true zurückgegeben, andernfalls wird false zurückgegeben.

return field1==other.field1&&field2.equals(other.field2)

Wenn equal in einer Unterklasse neu definiert wird, muss dies den Aufruf von super.equals(other) beinhalten. Wenn der Test fehlschlägt, ist Gleichheit unmöglich. Wenn die Felder in der Oberklasse gleich sind, werden die Instanzfelder in der Unterklasse verglichen.

Für Felder vom Typ Array können Sie die statische Methode Arrays.equals verwenden, um zu überprüfen, ob die entsprechenden Elemente gleich sind.

Schauen wir uns ein paar Beispiele für den String-Vergleich an:

String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a == b); // true 因为JAVA中字符串常量是共享的,只有一个拷贝
System.out.println(a == c); // false a和c属于2个不同的对象
System.out.println(a.equals(c)); // true 由于String对象的equals方法比较的是对象中的值,所以返回true。(和Object的equals方法不同)
System.out.println(c==d); // false c和d虽然对象内的值相同,但属于2个不同的对象,所以不相等
System.out.println(c.equals(d)); // true

Einfach ausgedrückt: Wenn Sie String-Konstanten vergleichen, gibt „equals“ das gleiche Ergebnis zurück wie „equals“, wenn Sie die Werte von String-Objekten vergleichen möchten. So verwenden Sie die Java-Methode equal()

Sehen Sie sich ein Beispiel für die Verwendung von equal an:

package chapter05.EqualsTest;
  
import java.util.*;
  
public class EqualsTest {
 public static void main(String[] args) {
  Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
  Employee alice2 = alice1; // reference the same object
  Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
  Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
  
  System.out.println("alice1 == alice2: " + (alice1 == alice2));
  
  System.out.println("alice1 == alice3: " + (alice1 == alice3));
  
  System.out.println("alice1.equals(alice3): " + (alice1.equals(alice3)));
  
  System.out.println("alice1.equals(bob): " + (alice1.equals(bob)));
  
  System.out.println(bob.toString());
 }
}
  
class Employee {
 public Employee(String n, double s, int year, int month, int day) {
  name = n;
  salary = s;
  GregorianCalendar calendar = new GregorianCalendar(year, month, day);
  hireDay = calendar.getTime();
 }
  
 public String getName() {
  return name;
 }
  
 public double getSalary() {
  return salary;
 }
  
 public Date getHireDay() {
  return hireDay;
 }
  
 public void raiseSalary(double byPercent) {
  double raise = salary * byPercent / 100;
  salary += raise;
 }
  
 @Override
 public boolean equals(Object otherObject) {
  // a quick test to see if the objects are identical
  if (this == otherObject)
   return true;
  
  // must return false if the explicit parameter is null
  if (otherObject == null)
   return false;
  
  // if the classed don't match,they can't be equal
  if (getClass() != otherObject.getClass())
   return false;
  
  // now we know otherObject is a non-null Employee
  Employee other = (Employee) otherObject;
  
  // test whether the fields hava identical values
  return name.equals(other.name) && salary == other.salary
    && hireDay.equals(other.hireDay);
  
 }
  
 @Override
 public int hashCode() {
  return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13
    * hireDay.hashCode();
 }
  
 @Override
 public String toString() {
  return getClass().getName() + "[name=" + name + ",salary=" + salary
    + ",hireDay=" + hireDay + "]";
 }
  
 private String name;
 private double salary;
 private Date hireDay;
}
  
class Manager extends Employee {
 public Manager(String n, double s, int year, int month, int day) {
  super(n, s, year, month, day);
  bouns = 0;
 }
  
 @Override
 public double getSalary() {
  double baseSalary = super.getSalary();
  return baseSalary + bouns;
 }
  
 public void setBouns(double b) {
  bouns = b;
 }
  
 @Override
 public boolean equals(Object otherObject) {
  if (!super.equals(otherObject))
   return false;
  Manager other = (Manager) otherObject;
  // super equals checked that this and other belong to the same class
  return bouns == other.bouns;
 }
  
 @Override
 public int hashCode() {
  return super.hashCode() + 17 * new Double(bouns).hashCode();
 }
  
 @Override
 public String toString() {
  return super.toString() + "[bouns=" + bouns + "]";
 }
  
 private double bouns;
}

Was ist der Unterschied zwischen equal() und ==?

==: Seine Funktion besteht darin, festzustellen, ob die Adressen zweier Objekte gleich sind. Das heißt, bestimmen Sie, ob zwei Objekte dasselbe Objekt sind.

equals(): Seine Funktion besteht auch darin, zu bestimmen, ob zwei Objekte gleich sind. Im Allgemeinen gibt es jedoch zwei Anwendungsfälle:

Fall 1: Die Klasse deckt die Methode equal() nicht ab. Dann ist der Vergleich zweier Objekte dieser Klasse über equal() gleichbedeutend mit dem Vergleich der beiden Objekte über „==“.
  • Fall 2: Die Klasse deckt die Methode equal() ab. Im Allgemeinen überschreiben wir die Methode equal(), um sicherzustellen, dass die Inhalte der beiden Objekte gleich sind. Wenn ihre Inhalte gleich sind, wird true zurückgegeben (d. h. die beiden Objekte werden als gleich betrachtet).
  • Vergleichen Sie unten ihre Unterschiede anhand von Beispielen.
Der Code lautet wie folgt:

import java.util.*;
import java.lang.Comparable;
 
/**
 * @desc equals()的测试程序。
 */
public class EqualsTest3{
 
 public static void main(String[] args) {
  // 新建2个相同内容的Person对象,
  // 再用equals比较它们是否相等
  Person p1 = new Person("eee", 100);
  Person p2 = new Person("eee", 100);
  System.out.printf("p1.equals(p2) : %s\n", p1.equals(p2));
  System.out.printf("p1==p2 : %s\n", p1==p2);
 }
 
 /**
  * @desc Person类。
  */
 private static class Person {
  int age;
  String name;
 
  public Person(String name, int age) {
   this.name = name;
   this.age = age;
  }
 
  public String toString() {
   return name + " - " +age;
  }
 
  /**
   * @desc 覆盖equals方法
   */
  @Override
  public boolean equals(Object obj){
   if(obj == null){
    return false;
   }
 
   //如果是同一个对象返回true,反之返回false
   if(this == obj){
    return true;
   }
 
   //判断是否类型相同
   if(this.getClass() != obj.getClass()){
    return false;
   }
 
   Person person = (Person)obj;
   return name.equals(person.name) && age==person.age;
  }
 }
}

Laufergebnisse:

p1.equals(p2) : true
p1==p2 : false

Ergebnisanalyse:

In EqualsTest3.java:

(1) p1.equals(p2)
    Dies ist: Bestimmen Sie, ob die Inhalte von p1 und p2 gleich sind. Da Person die Methode equal() überschreibt und diese equal() verwendet wird, um zu bestimmen, ob die Inhalte von p1 und p2 gleich sind, kommt es vor, dass die Inhalte von p1 und p2 gleich sind. Daher wird true zurückgegeben.
  • p1.equals(p2)
    这是判断p1和p2的内容是否相等。因为Person覆盖equals()方法,而这个equals()是用来判断p1和p2的内容是否相等,恰恰p1和p2的内容又相等;因此,返回true。

  • (2) p1==p2
    (2) p1==p2

    Hiermit wird ermittelt, ob p1 und p2 dasselbe Objekt sind. Da es sich jeweils um zwei neu erstellte Personenobjekte handelt, wird false zurückgegeben.

Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Programmierunterricht

! ! 🎜

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Java-Methode equal(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn