【java】java.equals

来源:互联网 发布:html怎么跟php文件连接 编辑:程序博客网 时间:2024/06/06 18:24

原文地址:http://blog.csdn.net/xiongchao2011/article/details/7071953

object类中的equals方法用于检测一个对象是否等于另一个对象。在Object类中,这个方法判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的。从这点上看,将其作为默认操作也是合乎情理的。然而,对于多数类类说,这种判断并没有什么意义,例如,采用这种方式比较两个PrintStream是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。所以一般在自定义类中都要重写equals比较。

/*上面部分内容,个人还是存在异议。

==用来判断两个对象引用地址是否相同,如果相同,代表的就是同一个对象,如果不相等,就代表为不同的对象。比较的是栈中的地址

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。

import java.util.*;class Employee {    private String name;    private double salary;    private Date hireDay;    public Employee(){    }    public Employee(String n, double s, int year, int month, int day) {        this.name = n;        this.salary = s;        GregorianCalendar calendar = new GregorianCalendar(year, month, day);        this.hireDay = calendar.getTime();    }    public String getName() {        return this.name;    }    public double getSalary() {        return this.salary;    }    public Date getHireDay() {        return this.hireDay;    }    public void raiseSalary(double byPercent) {        double raise = this.salary * byPercent / 100;        this.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 this.name.equals(other.name) && this.salary == other.salary                && this.hireDay.equals(other.hireDay);    }    @Override    public int hashCode() {        return 7 * this.name.hashCode() + 11 * new Double(this.salary).hashCode() + 13                * this.hireDay.hashCode();    }    @Override    public String toString() {        return getClass().getName() + "[name=" + this.name + ",salary=" + this.salary                + ",hireDay=" + this.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;}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());    }}




0 0
原创粉丝点击