【第22期】观点:IT 行业加班,到底有没有价值?

重写equals

原创 2016年08月29日 13:14:29

多有对象的equals方法都继承于基类Object的方法

* if {@code x} and {@code y} refer to the same object
     * ({@code x == y} has the value {@code true}).
     * <p>
     * Note that it is generally necessary to override the {@code hashCode}
     * method whenever this method is overridden, so as to maintain the
     * general contract for the {@code hashCode} method, which states
     * that equal objects must have equal hash codes.
     *
     * @param   obj   the reference object with which to compare.
     * @return  {@code true} if this object is the same as the obj
     *          argument; {@code false} otherwise.
     * @see     #hashCode()
     * @see     java.util.HashMap
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }
而父类的equals方式其实只是用 == 来比较,比较的其实是对象的地址,像我们平时用的String的equals 比较的值是否相等,其实是String 重写了equals方法

 /**
     * Compares this string to the specified object.  The result is {@code
     * true} if and only if the argument is not {@code null} and is a {@code
     * String} object that represents the same sequence of characters as this
     * object.
     *
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    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;
    }
我们有时候在项目的过程中需要对比对象值是否相等,需要自己重写equals方法。

重写equals的要求

1.自反性:对于任何非空引用x,x.equals(x)应该返回true。
2.对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3.传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4.一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5.非空性:对于任意非空引用x,x.equals(null)应该返回false。

@Override
public boolean equals(Object obj){
	//1. 判断是否同一引用
	if(this == obj) return true;
	//2. 判断参数是否为null
	if(obj == null) return false;
	//3. 判断是否同一类型
	if(getClass() != obj.getClass()) return false;//注: 判断是否指向方法区的地址
	//4. 如果是同一类型,强转 比较每一个字段
	Student stu = (Student)obj;
	if(this.age == stu.age && this.name.equals(stu.name)){
		return true;
	}
	return false;
}

总结一下思路:

1.判断是否是同一个引用,如果是同一引用 直接返回true

2.如果不是同一引用,判断参数是否为null,如果为null,直接return false,否则继续往下执行

3.如果参数不为null,判断是否是同一个类型,如果不是,直接返回 false

4.如果是同一个类型,比较每一个字段的值是否都相等,如果都相等返回 true,否则返回 false


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

JAVA中重写equals()方法为什么要重写hashcode()方法

那为什么在重写equals方法时都要重写equals方法呢: 首先equals与hashcode间的关系是这样的: 1、如果两个对象相同(即用equals比较返回true),那么它们的hash...

重写equals()方法

      在比较两个对象时可以使用==和equals()。==用于比较两个对象的引用地址是否相等,而equals()方法主要用于比较两个对象的内容是否相等。       在Object中已定义了equals()方法,但是该方法直接采用==操作符实现

《Effective Java》笔记之重写equals时要遵守的通用约定

最近在阅读鼎鼎大名的《Effective Java》,想把一些自己觉得比较经典的内容以笔记形式记录在博客中,这是第一篇,接下来一段时间会持续更新笔记。 重写quals方法看起来很简单,但是不正确的重...

重写hashCode和equals方法

如果你的对象想散列存储的集合中或者想作为散列Map的Key时(HashSet、HashMap、Hashtable等)那么你必须重写equals()方法,这样才能保证唯一性。在重写equals()方法的同时,必须重写hashCode()方法?当然,在这种情况下,你不想重写hashCode()方法,也没有错,但是sun建议这么做,重写hashCode只是技术要求(为了提高效率)。 <span style="font-family: Comic Sans M

java中重写equals方法

import java.util.Date;class Dog{ private String name; private Date birthday;   public String getName...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)