欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

覆盖/重写Object类中equals方法

程序员文章站 2022-04-15 23:45:29
...

我们在写程序时,往往有时Java类库中的equals方法不能满足我们的需求。这时,就需要我们自己来定义equals方法。

在写自定义equals方法之前,我满先来看两个类库中已经写好的equals方法。

一、Object.equals()

很简单的一个方法,因为是Object的方法,所以对所有对象都适用。

public boolean equals(Object obj) {
        return (this == obj);
    }

二、String.equals()

private final char value[];

public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

我们来看String类重写equals方法时,都做了些什么。

首先是判断是不是自己,如果是自己好办,直接返回true就完事了。

然后如果不是自己,先看看传入的参数是否为String类型,不是返回false就完事。

再然后都是String类型了,在比较长度是否相等,每个字符的值是否相等,全都相等就返回true。

三、自定义equals()

通过模仿String.equals(),我们来写Person.equals()。

class Person {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public boolean equals(Object another) {

        //先判断是不是自己,提高运行效率
		if (this == another)
			return true;

        //再判断是不是Person类,提高代码的健壮性
		if (another instanceof Person) {

            //向下转型,父类无法调用子类的成员和方法
			Person anotherPerson = (Person) another;

            //最后判断类的所有属性是否相等,其中String类型和Object类型可以用相应的equals()来判断
			if ((this.getName().equals(anotherPerson.getName())) && (this.getAge() == anotherPerson.getAge()))
				return true;
		} else {
			return false;
		}

		return false;
	}
}


}

在覆盖equals()时,我们在自定义equals内部调用了Object.equals()和String.equals()。

 

四、自动生成的equals()

考虑到实际中我们可能会经常覆写equals(),因此eclipse为我们提供自动生成的equals()。

覆盖/重写Object类中equals方法

操作过程如上图所示,读者可自行操作查看自动生成的代码。