zoukankan      html  css  js  c++  java
  • equals方法的源码解析

     阅读jdk API我们知道Object class在java.lang包下。Object class是Object结构的跟。

      jdk1.8 API在线地址 :https://blog.fondme.cn/apidoc/jdk-1.8-baidu/

     Object class中的方法有

                                          hashCode(),equals(),clone(),notify(),notifyAll(),wait(),finalize()

    package java.lang;
    
     
    public class Object {
    
        private static native void registerNatives();
        static {
            registerNatives();
        }
        public final native Class<?> getClass();
        public native int hashCode();
        public boolean equals(Object obj) {
            return (this == obj);
        }
        protected native Object clone() throws CloneNotSupportedException;   
        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
        public final native void notify();
        public final native void notifyAll();
        public final native void wait(long timeout) throws InterruptedException;
        public final void wait(long timeout, int nanos) throws InterruptedException {
            if (timeout < 0) {
                throw new IllegalArgumentException("timeout value is negative");
            }
            if (nanos < 0 || nanos > 999999) {
                throw new IllegalArgumentException(
                                   "nanosecond timeout value out of range");
            }
            if (nanos > 0) {
                timeout++;
            }
            wait(timeout);
        }
        public final void wait() throws InterruptedException {
            wait(0);
        }
        protected void finalize() throws Throwable { }
    }
    

     1.首先看equals()方法。

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

     equals方法是用来比较其他对象是否等于此对象。

     equals方法在非空对象引用上实现等价关系:

     自反性:对于任何的非空的参考值x, x.equals(x) 应该返回true。

    对称性:对于任何非空引用值x和y,x.equals(y)应该返回true,当且仅当y.equals(x)返回true。

    传递性:对于任何非空引用值x,y,z 。x.equlas(y)返回true,y.equals (z)返回true。然后x.equals(z)应该返回true。

    一致性:对于任何非空引用值x,y。多次调用x.equals (y) 始终返回true或false。在不修改x和y 的值的情况下一直成立。

    对于任何非空参考值x,x.equals(null) 始终返回false。

    equals类方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值xy ,当且仅当xy引用相同的对象( x == y具有值true )时,该方法返回true

    请注意,无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。

    2. equals方法比较字符串是否相等时。

     private final char value[];
    public boolean equals(Object anObject) { if (this == anObject) { return true; }
    //判断是否是String类型的实例 if (anObject instanceof String) { String anotherString = (String)anObject; //强转为String类型 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; }

     3.equals判断对象是否相等时;

    重写equals和hashCode方法

        @Override
        public boolean equals(Object o) {
            if (this == o) return true; //判断内存地址是否相同 相同返回true
            if (!(o instanceof UserInfo)) return false;//判断被比较的对象与此对象是否是同一类型的,不同类型返回false
    
            UserInfo userInfo = (UserInfo) o;//强制类型转换 将被比较类型转换为此类型
    //分别比较两对象的属性值时候相同 只要存在一个属性值不相同返回false  全部相同返回true
            if (!getUserid().equals(userInfo.getUserid())) return false;
            if (!getUname().equals(userInfo.getUname())) return false;
            return getUage().equals(userInfo.getUage());
        }
    
        @Override
        public int hashCode() {
            int result = getUserid().hashCode();
            result = 31 * result + getUname().hashCode();
            result = 31 * result + getUage().hashCode();
            return result;
        }
    
  • 相关阅读:
    JavaScript高级程序设计:第十二章
    JavaScript高级程序设计:第九章
    PageHelper的使用方法
    dbutils的环境搭建以及使用
    Spring的xml中引入其他文件
    Spring AOP
    SpringMVC拦截器
    中文乱码的过滤器
    SpringMVC的处理器全局异常处理类
    SpringMVC返回一个JSON对象到界面
  • 原文地址:https://www.cnblogs.com/cuixiaomeng/p/11367696.html
Copyright © 2011-2022 走看看