Java中常用的equals方法源码解析

 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Arrays,Date在这些类当中equals有其自身的实现,而不再仅限于比较类在堆内存中的存放地址了。

java.lang.Object:equals初始比较方法

public boolean equals(Object obj) {
        //java中==符号在比较复合型数据类型(类)时比较的是对象在内存中的存放地址,只有同个new出来的对象,
        //他们在内存中的存发地址才一样,比较结果才为true,否则为false
        return (this == obj);
    }

1.java.lang.String的equals()方法

public boolean equals(Object anObject) {
        //首先看一下是不是比较同一个对象,如果是直接返回true
        if (this == anObject) {
            return true;
        }
        //判断anObject是否为String的一个实例,如果不是直接返回false
        //如果是再进一步判断两个字符串是否相等:将字符串转化为char数组进行一一比较
        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;
    }

2.java.util.Arrays的equals()方法

public static boolean equals(int[] a, int[] a2) {
        //两个数组为同一对象返回true
        if (a==a2)
            return true;
        //两个数组全为null返回false
        if (a==null || a2==null)
            return false;
        //两个数组长度不一返回false
        int length = a.length;
        if (a2.length != length)
            return false;
        //两个数组不是同一对象,不为null且长度相等再比较数组的每一个元素是否都相等
        for (int i=0; i

3.java.util.Objects的equals()方法

public static boolean equals(Object a, Object b) {
        //如果a,b都为null返回true,如果只有一个为null返回false,否则返回a.equals(b)的结果
        return (a == b) || (a != null && a.equals(b));
    }

4.java.util.Date的equals()方法

public boolean equals(Object obj) {
        //obj必须是Date类型,在把两个时间转化为从GMT 1970-01-01 00:00:00到此date对象上时间的毫秒数进行比较
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    }

参考博客--浅谈java中的"=="和eqals区别:https://www.cnblogs.com/shenwen/p/8427450.html 

你可能感兴趣的:(Java基础)