Rumah >Java >JavaAsas >Bagaimana untuk menggunakan kaedah java equals().

Bagaimana untuk menggunakan kaedah java equals().

青灯夜游
青灯夜游asal
2023-01-06 14:42:109167semak imbas

Dalam java, kaedah equals() digunakan untuk mengesan sama ada satu objek sama dengan objek lain, sintaksnya ialah "Object.equals(Object2)"; kaedah ini menentukan sama ada dua objek mempunyai rujukan yang sama. Jika dua Objek mempunyai rujukan yang sama, ia mestilah sama. Kaedah equals() tidak boleh beroperasi pada pembolehubah jenis data asas.

Bagaimana untuk menggunakan kaedah java equals().

Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Java 8, komputer DELL G3.

Kaedah java equals() menentukan sama ada objek adalah sama

Kaedah sama digunakan untuk mengesan sama ada satu objek adalah. sama dengan objek lain. Nota: Kaedah equals tidak boleh bertindak pada pembolehubah jenis data asas

Dalam kelas Object, kaedah ini menentukan sama ada dua objek mempunyai rujukan yang sama Jika dua objek mempunyai rujukan yang sama, ia mestilah sama .

Dari sudut pandangan ini, masuk akal untuk menjadikan ini sebagai tindakan lalai. Walau bagaimanapun, untuk kebanyakan kelas, penghakiman ini tidak masuk akal Sebagai contoh, adalah tidak bermakna untuk membandingkan dua PrintStream dengan cara ini. Walau bagaimanapun, selalunya perlu untuk mengesan kesamaan keadaan dua objek Jika keadaan dua objek adalah sama, kedua-dua objek itu dianggap sama. Oleh itu, perbandingan yang sama mesti ditindih dalam kelas tersuai.

Berikut ialah cadangan untuk menulis kaedah perfect equals():

(1) Parameter eksplisit dinamakan otherObject, yang perlu ditukar kepada pembolehubah yang dipanggil lain kemudian

(2) Semak sama ada ini dan lain-lainObjek merujuk kepada objek yang sama:

if(this==otherObject) return true;

Pernyataan ini hanyalah pengoptimuman. Sebenarnya, ini adalah bentuk yang sering diambil. Kerana pengiraan persamaan ini jauh lebih murah daripada membandingkan medan dalam kelas satu demi satu.

(3) Semak sama ada otherObject adalah null. Jika ia adalah null, return false. Ujian ini sangat diperlukan.

if(otherObject==null) return false;

(4) Bandingkan ini dan objek lain untuk melihat sama ada ia tergolong dalam kelas yang sama Jika semantik sama berubah dalam setiap subkelas, gunakan getClass() untuk mengesannya dan gunakannya sebagai kelas sasaran.

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

Jika semua subkelas mempunyai semantik yang sama, gunakan instanceof untuk mengesan

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

(5) Tukar otherObject kepada pembolehubah jenis yang sepadan:

ClassName other=(ClassName)otherObject;

(6) Sekarang mula bandingkan semua bidang yang perlu dibandingkan. Gunakan == untuk membandingkan medan jenis asas dan sama dengan untuk membandingkan medan objek. Jika semua medan sepadan, kembalikan benar, sebaliknya kembalikan palsu;

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

Jika sama dengan ditakrifkan semula dalam subkelas, ia mesti termasuk memanggil super.equals(other). Jika ujian gagal, kesaksamaan adalah mustahil. Jika medan dalam superclass adalah sama, medan contoh dalam subclass akan dibandingkan.

Untuk medan jenis tatasusunan, anda boleh menggunakan kaedah Arrays.equals statik untuk menyemak sama ada elemen yang sepadan adalah sama.

Mari kita lihat beberapa contoh perbandingan rentetan:

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

Bagaimana untuk menggunakan kaedah java equals().

Ringkasnya, apabila membandingkan pemalar rentetan, sama dan sama mengembalikan keputusan Begitu juga, gunakan sama apabila anda ingin membandingkan nilai objek rentetan.

Lihat contoh penggunaan equals:

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

Apakah perbezaan antara equals() dan ==?

== : Fungsinya adalah untuk menentukan sama ada alamat dua objek adalah sama. Iaitu, tentukan sama ada dua objek adalah objek yang sama.

equals(): Fungsinya juga untuk menentukan sama ada dua objek adalah sama. Tetapi ia biasanya mempunyai dua kes penggunaan:

  • Kes 1, kelas tidak meliputi kaedah equals(). Kemudian membandingkan dua objek kelas ini melalui equals() adalah sama dengan membandingkan dua objek melalui "==".

  • Kes 2, kelas merangkumi kaedah equals(). Secara amnya, kami mengatasi kaedah equals() untuk memastikan kandungan kedua-dua objek adalah sama jika kandungannya sama, true dikembalikan (iaitu, kedua-dua objek itu dianggap sama).

Di bawah, bandingkan perbezaan mereka melalui contoh.

Kod adalah seperti berikut:

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

Hasil berjalan:

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

Analisis keputusan:

Dalam EqualsTest3 .java :

  • (1) p1.equals(p2)
    Ini untuk menentukan sama ada kandungan p1 dan p2 adalah sama. Oleh kerana Orang mengatasi kaedah equals() dan ini equals() digunakan untuk menentukan sama ada kandungan p1 dan p2 adalah sama, ia berlaku bahawa kandungan p1 dan p2 adalah sama oleh itu, benar dikembalikan.

  • (2) p1==p2
    Ini adalah untuk menentukan sama ada p1 dan p2 adalah objek yang sama. Oleh kerana ia adalah dua objek Orang yang baru dicipta oleh itu, palsu dikembalikan.

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Pengajaran Pengaturcaraan! !

Atas ialah kandungan terperinci Bagaimana untuk menggunakan kaedah java equals().. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Apakah tiga ciri utama javaArtikel seterusnya:Apakah tiga ciri utama java