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

来源:互联网 发布:51单片机流水灯原理图 编辑:程序博客网 时间:2024/05/20 06:24

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

String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1.equals(str2));//trueSystem.out.println(str1.hashCode());//96354System.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方法我将在以后为大家整理。

原创粉丝点击