重写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


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

winform 重写Equals源码

  • 2009年11月26日 14:44
  • 5KB
  • 下载

重写equals方法

  • 2013年08月21日 12:21
  • 48KB
  • 下载

往ArrayList 传自定义对象并重写Equals()

/*往ArrayList 传自定义对象并重新Equals() 去除ArrayList集合中的重复元素。 */ /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。 比如:存人对象。...
  • blacop
  • blacop
  • 2016年07月11日 16:58
  • 483

重写toString和equals方法

  • 2013年06月04日 21:28
  • 15KB
  • 下载

为什么在重写了equals()方法之后也必须重写hashCode()方法

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。    ...

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

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true; 注意:当此...

java重载与重写的区别+重写父类equals方法的完美实现

【0】README0.1) 本文章节【1】和【2】的内容转自 http://www.cnblogs.com/bluestorm/archive/2012/03/01/2376236.html ; ...

第一题(equals和hashCode的重写)

equals和hashcode的重写

如何正确的重写equals() 和 hashCode()方法

equals和hashCode重写技巧

【Effective Java】Ch3_Methods:Item8_重写equals方法时遵循通用约定

虽然Object类是一个具体类,但它主要还是用于扩展。因为其所有nonfinal方法(equals、hashCode、toString、clone以及finalize)都是为重写设计的,所以这些方法都...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重写equals
举报原因:
原因补充:

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