String类中的equals方法与Object类中equals方法的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36952611/article/details/72841966

今天在无意中发现一个小知识点,难度不大就是简单和大家分享一下。

String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2));//true
System.out.println(str1.hashCode());//96354
System.out.println(str1.hashCode());//96354

结果为true没有什么异议,我们都知道equals比较的是两个字符串的内存地址。那么str1与str2的hashCode为什么相同呢?因为字符串的hashCode是由内容导出的,这里也就说明了str1与str2有着相同的内容(因为hashCode相同啊)。接着我们来看String类的jdk源码

public boolean equals(Object anObject) {
//只要两个字符串的引用相同就返回true(这里不再赘述常量池的知识)
        if (this == anObject) {
            return true;
        }
/*为什么会出现这一步比较呢?如果现在String str1 = new String("张三");这样一个简单的字符串和一个自己定义的Student类中的name = "张三"比较的话,它的意义就出现了,先将其强转为String类型,比较长度接着将字符串赋值给字符数组比较每一个值*/
        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方法比较两个字符串的本质还是在使用==做比较。(源码注释是我自己加的)

Object类中的equals方法

Employee emp1 = new Employee("张三", 5000, 2005, 5 ,5);
Employee emp3 = new Employee("张三", 5000, 2005, 5 ,5);
System.out.println(emp3.equals(emp1));

这段代码如果我说前提条件直接问你结果,我相信会有一部分人直接回答是true(这也是我写这篇文章的目的)。
如果在Employee类中没有重写equals方法的话那么其实结果是false。我们在初学equals方法的时候都认为equals方法比较的是内容,只要内容相同就是true(最起码我一开始是这么认为的)。如果在Employee类中没有重写equals方法它调用的就会是Object类中的equals方法,我们来看jdk中的源码:

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

我看错了吗?这就是源码就这么一点,是的!现在你知道为什么直接调用Object的equals方法为什么是false的吧。这就是我们为什么要经常强调,为每一个类重写equals方法。为什么需要重写hashCode和toString方法我将在以后为大家整理。

猜你喜欢

转载自blog.csdn.net/qq_36952611/article/details/72841966