equals 和 hashcode 区别 ==和equals

    xiaoxiao2021-03-25  140

    转载请注明出处!! 解析一下Object类 和 String 类中的equals 和 hashcode 方法的异同点。 Object类中 hashcode方法,是使用native修饰,原生方法,与本地机器有关,上传图片一直失败,贴代码: public native int hashCode(); 而String类中 hashcode方法,被重写,代码: public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; } 按照上图的生成规则,“abc”的hashcode应该是 int hash=a*31^2+b*31^1+c*31^0; 至于为什么选择31来做底数? 中文:http://blog.csdn.net/steveguoshao/article/details/12576849 En:http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier)

    看完了hashcode方法再看看equals方法

    Object类的equals方法,先上源代码,如图: 直接判断,两个是不是同一个对象,而不仅仅是比较内容,地址也必须相同,这也是==作用所在之处,但是基本类型是可以直接使用==判断内容的,因为基本类型并没有生成类,而equals方法的使用,必须依赖于类,所以Object类equals使用的时候,真的就是判断两个类是不是同一个类了。

    String 类的equals方法,源代码,屏幕太小,直接贴源代码了:

    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; }

    String 的equals 方法先双等号(==)判断比较的对象是不是同一个对象,即存放的地址是不是相同,如果不是同一个对象,那么降低一下要求,存放的内容是不是相同呢,相同,ok,那么返回TRUE,内容不同,真的没法补救了。 从图中,也可以看出,对于String类==对于非基本数据类型来说,一定是判断存放的位置是不是相同,而equals只要求内容一样就可。 而且,hashcode和equals还有如下默认关系: 对String来说 : 1. hashcode不同,equals 肯定不相同 2. hashcode 相同,equals也可能不同 3. equals 相同,hashcode一定相同 4. equals 不同,hashcode也可能相同

    先到这吧!

    转载请注明原文地址: https://ju.6miu.com/read-3191.html

    最新回复(0)