在java中,equals()方法用於檢測一個物件是否等於另一個物件,語法「Object.equals(Object2)」;該方法判斷兩個物件是否具有相同的參照,如果兩個物件具有相同的參照,它們一定是相等的。equals()方法不能作用於基本資料型別的變數。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
java equals()方法判斷物件是否相等
equals方法用於檢測一個物件是否等於另一個物件。注意:equals方法不能作用於基本資料型別的變數
在Object類中,這個方法判斷兩個物件是否具有相同的參照,如果兩個物件具有相同的參照,它們一定是相等的。
從這點上看,將其作為預設操作也是合乎情理的。然而,對於多數類來說,這種判斷並沒有什麼意義,例如,採用這種方式比較兩個PrintStream是否相等就完全沒有意義。然而,經常需要檢測兩個物件狀態的相等性,如果兩個物件的狀態相等,就認為這兩個物件是相等的。所以一般在自定義類中都要重寫equals比較。
下面給出編寫一個完美equals()方法的建議:
(1)顯式引數命名為otherObject,稍後需要將轉換成一個叫other的變數
(2)檢測this與otherObject是否參照同一個物件:
if(this==otherObject) return true;
登入後複製
這條語句只是一個優化。實際上,這是一種經常採用的形式。因為計算這個等式要比一個一個地比較類中的域所付出的代價小的多。
(3)檢測otherObject是否為null,如果為null,返回false。這項檢測是很必要的。
if(otherObject==null) return false;
登入後複製
(4)比較this和otherObject是否屬於同一個類,如果equals的語意在每個子類中有所改變,就使用getClass()檢測,它將自己作為目標類
if(getClass()!=otherObject.getClass()) return false;
登入後複製
如果所有的子類都擁有同一的語意,就使用instanceof檢測
if(!(otherObject instanceof ClassName)) return false;
登入後複製
(5)將otherObject轉換為相應型別的變數:
ClassName other=(ClassName)otherObject;
登入後複製
(6)現在開始對所有需要比較的域進行比較。使用==比較基本型別域,使用equals比較物件域。如果所有域都匹配,就返回true,否則返回false;
return field1==other.field1&&field2.equals(other.field2)
登入後複製
如果在子類中重新定義equals,就要在其中包含呼叫super.equals(other)。如果檢測失敗,就不可能相等。如果超類中的域相等,就比較子類中的範例域。
對於陣列型別的域,可以使用靜態的Arrays.equals方法檢測相應的元素是否相等。
來看幾個字串比較例子:
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
登入後複製
簡單的說,當比較字串常數時,等於和equals返回的結果一樣,當想比較字串物件的值時用equals。
看一個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;
}
登入後複製
equals() 與 == 的區別是什麼?
== : 它的作用是判斷兩個物件的地址是不是相等。即,判斷兩個物件是不是同一個物件。
equals() : 它的作用也是判斷兩個物件是否相等。但它一般有兩種使用情況:
情況1,類沒有覆蓋equals()方法。則通過equals()比較該類的兩個物件時,等價於通過「==」比較這兩個物件。
情況2,類覆蓋了equals()方法。一般,我們都覆蓋equals()方法來兩個物件的內容相等;若它們的內容相等,則返回true(即,認為這兩個物件相等)。
下面,通過範例比較它們的區別。
程式碼如下:
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;
}
}
}
登入後複製
執行結果:
p1.equals(p2) : true
p1==p2 : false
登入後複製
結果分析:
在EqualsTest3.java 中:
(1) p1.equals(p2)
這是判斷p1和p2的內容是否相等。因為Person覆蓋equals()方法,而這個equals()是用來判斷p1和p2的內容是否相等,恰恰p1和p2的內容又相等;因此,返回true。
(2) p1==p2
這是判斷p1和p2是否是同一個物件。由於它們是各自新建的兩個Person物件;因此,返回false。
更多程式設計相關知識,請存取:!!
以上就是java equals()方法怎麼用的詳細內容,更多請關注TW511.COM其它相關文章!