java 中 equals() 相等的两个对象,hashcode() 一定相等 java中值相同,hashcode一定相同吗

java hashcode\u76f8\u540c\uff0cequals\u4e00\u5b9a\u4e3a\u771f\uff1fequals\u4e3a\u771f\uff0chashcode\u4e0d\u4e00\u5b9a\u4e3a\u771f\uff1f

\u4e24\u8005\u4e4b\u95f4\u552f\u4e00\u7684\u5fc5\u7136\u5173\u7cfb\u88ab\u4f60\u8bf4\u53cd\u4e86\uff0cequls\u8fd4\u56de\u4e3atrue,\u5219\u4e24\u8005\u7684hashcode\u4e00\u5b9a\u76f8\u7b49\uff0c\u610f\u5373\u76f8\u7b49\u7684\u5bf9\u8c61\u5fc5\u987b\u5177\u6709\u76f8\u7b49\u7684\u54c8\u5e0c\u7801\u3002\u6bcf\u5f53equals\u65b9\u6cd5\u88ab\u8986\u5199\uff0c\u901a\u5e38\u9700\u8981\u91cd\u5199hashCode\u65b9\u6cd5\u4ece\u800c
\u4fdd\u6301\u5bf9\u8c61\u884c\u4e3a\u7684\u4e00\u81f4\u6027\u3002\u800c\u5177\u6709\u76f8\u7b49\u7684hashcode\u7684\u4e24\u4e2a\u5bf9\u8c61equals\u4e0d\u4e00\u5b9a\u6210\u7acb\u3002\u4f60\u53ef\u4ee5\u8fd9\u6837\u8ba4\u4e3a\u4e5f\u884c\uff0chashcode\u662f\u4f5c\u4e3a\u4e00\u4e2a\u5bf9\u8c61\u5b58\u50a8\u7684\u53c2\u8003\uff0chash\u8868\u672c\u8eab\u662f\u4e00\u79cd\u6563\u5217\u8868\uff0c\u5728\u6570\u636e\u5b58\u50a8\u8fd9\u5757\uff0c\u529f\u6548\u6bd4\u8f83\u5927\uff0c\u800cequals\u662f\u76f8\u5f53\u4e8e\u4e24\u5bf9\u8c61\u4e4b\u95f4\u7684\u5c5e\u6027\uff08\u6210\u5458\u53d8\u91cf\uff09\u201c\u76f8\u7b49\u201d\uff0c\u610f\u5373\u5177\u6709\u76f8\u540c\u7684\u884c\u4e3a\uff08\u65b9\u6cd5\uff09\u3002\u6216\u8bb8\u8fd9\u6837\u8bb2\u8d77\u6765\u7406\u89e3\u6bd4\u8f83\u7684\u8d39\u52b2\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u6bd4\u5982\u4f60\u5b9a\u4e49class A\u6709\u4e24\u4e2a\u5c5e\u6027\uff0cint aA,aB,\u5728\u5b9a\u4e49\u4e00\u4e2aclass B\u4e5f\u6709\u4e24\u4e2a\u5c5e\u6027\uff0cint bA,bB,\u7136\u540e\u8986\u5199hashcode\u65b9\u6cd5\uff0cA\u7c7b\u4e3areturn aA*aB;B\u7c7b\u4e3areturn bA*bB.\u73b0\u5728\u60c5\u51b5\u5df2\u7ecf\u5f88\u663e\u7136\u4e86\uff0c\u5404\u81ea\u5b9e\u4f8b\u5316\u4e00\u4e2a\u5bf9\u8c61:a,b,\u5047\u5982:a.aA=b.bA,a.aB=b.bB,\u76f8\u7b49\uff0c\u6216\u8005a.aA=b.bB,a.aB=b.bA\u4e24\u4e2a\u5bf9\u8c61a,b\u7684hashcode\u4e00\u5b9a\u76f8\u7b49\uff0c\u5f53\u65f6\u4f60\u80fd\u8bf4\u4e24\u4e2a\u5bf9\u8c61\u76f8\u7b49\u5417\uff1f\u663e\u7136\u4e0d\u80fd\u5427\uff0ca\u4e0eb\u90fd\u662f\u4e0d\u540c\u7c7b\u7684\u5b9e\u4f8b\u3002\u8fdeequals\u6700\u57fa\u672c\u7684obj instance of A\u6216\u662fobj instance of B\u90fd\u4e0d\u6210\u7acb\u3002\u5982\u679c\u662f\u540c\u4e00\u4e2a\u7c7b\u7684\u4e0d\u540c\u5bf9\u8c61\uff0c\u5f53\u4e24\u8005\u62e5\u6709\u76f8\u540chashcode\u7684\u65f6\u5019\uff0c\u5219\u4e00\u5b9a\u76f8\u7b49\uff0c\u6216\u8005equals\u6210\u7acb\u7684\u65f6\u5019\u5219hashcode\u4e00\u5b9a\u4e3a\u771f\uff0c\u8fd9\u4e5f\u5c31\u662f\u6240\u8c13\u7684\u76f8\u7b49\u7684\u5bf9\u8c61\u5177\u6709\u884c\u4e3a\u4e00\u81f4\u6027\u3002

\u4e24\u8005\u4e4b\u95f4\u552f\u4e00\u7684\u5fc5\u7136\u5173\u7cfb\u88ab\u4f60\u8bf4\u53cd\u4e86\uff0cequls\u8fd4\u56de\u4e3atrue,\u5219\u4e24\u8005\u7684hashcode\u4e00\u5b9a\u76f8\u7b49\uff0c\u610f\u5373\u76f8\u7b49\u7684\u5bf9\u8c61\u5fc5\u987b\u5177\u6709\u76f8\u7b49\u7684\u54c8\u5e0c\u7801\u3002\u6bcf\u5f53equals\u65b9\u6cd5\u88ab\u8986\u5199\uff0c\u901a\u5e38\u9700\u8981\u91cd\u5199hashCode\u65b9\u6cd5\u4ece\u800c
\u4fdd\u6301\u5bf9\u8c61\u884c\u4e3a\u7684\u4e00\u81f4\u6027\u3002\u800c\u5177\u6709\u76f8\u7b49\u7684hashcode\u7684\u4e24\u4e2a\u5bf9\u8c61equals\u4e0d\u4e00\u5b9a\u6210\u7acb\u3002\u4f60\u53ef\u4ee5\u8fd9\u6837\u8ba4\u4e3a\u4e5f\u884c\uff0chashcode\u662f\u4f5c\u4e3a\u4e00\u4e2a\u5bf9\u8c61\u5b58\u50a8\u7684\u53c2\u8003\uff0chash\u8868\u672c\u8eab\u662f\u4e00\u79cd\u6563\u5217\u8868\uff0c\u5728\u6570\u636e\u5b58\u50a8\u8fd9\u5757\uff0c\u529f\u6548\u6bd4\u8f83\u5927\uff0c\u800cequals\u662f\u76f8\u5f53\u4e8e\u4e24\u5bf9\u8c61\u4e4b\u95f4\u7684\u5c5e\u6027\uff08\u6210\u5458\u53d8\u91cf\uff09\u201c\u76f8\u7b49\u201d\uff0c\u610f\u5373\u5177\u6709\u76f8\u540c\u7684\u884c\u4e3a\uff08\u65b9\u6cd5\uff09\u3002\u6216\u8bb8\u8fd9\u6837\u8bb2\u8d77\u6765\u7406\u89e3\u6bd4\u8f83\u7684\u8d39\u52b2\u3002\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u6bd4\u5982\u4f60\u5b9a\u4e49class A\u6709\u4e24\u4e2a\u5c5e\u6027\uff0cint aA,aB,\u5728\u5b9a\u4e49\u4e00\u4e2aclass B\u4e5f\u6709\u4e24\u4e2a\u5c5e\u6027\uff0cint bA,bB,\u7136\u540e\u8986\u5199hashcode\u65b9\u6cd5\uff0cA\u7c7b\u4e3areturn aA*aB;B\u7c7b\u4e3areturn bA*bB.\u73b0\u5728\u60c5\u51b5\u5df2\u7ecf\u5f88\u663e\u7136\u4e86\uff0c\u5404\u81ea\u5b9e\u4f8b\u5316\u4e00\u4e2a\u5bf9\u8c61:a,b,\u5047\u5982:a.aA=b.bA,a.aB=b.bB,\u76f8\u7b49\uff0c\u6216\u8005a.aA=b.bB,a.aB=b.bA\u4e24\u4e2a\u5bf9\u8c61a,b\u7684hashcode\u4e00\u5b9a\u76f8\u7b49\uff0c\u5f53\u65f6\u4f60\u80fd\u8bf4\u4e24\u4e2a\u5bf9\u8c61\u76f8\u7b49\u5417\uff1f\u663e\u7136\u4e0d\u80fd\u5427\uff0ca\u4e0eb\u90fd\u662f\u4e0d\u540c\u7c7b\u7684\u5b9e\u4f8b\u3002\u8fdeequals\u6700\u57fa\u672c\u7684obj instance of A\u6216\u662fobj instance of B\u90fd\u4e0d\u6210\u7acb\u3002\u5982\u679c\u662f\u540c\u4e00\u4e2a\u7c7b\u7684\u4e0d\u540c\u5bf9\u8c61\uff0c\u5f53\u4e24\u8005\u62e5\u6709\u76f8\u540chashcode\u7684\u65f6\u5019\uff0c\u5219\u4e00\u5b9a\u76f8\u7b49\uff0c\u6216\u8005equals\u6210\u7acb\u7684\u65f6\u5019\u5219hashcode\u4e00\u5b9a\u4e3a\u771f\uff0c\u8fd9\u4e5f\u5c31\u662f\u6240\u8c13\u7684\u76f8\u7b49\u7684\u5bf9\u8c61\u5177\u6709\u884c\u4e3a\u4e00\u81f4\u6027\u3002

在java中,equals和hashcode是有设计要求的,equals相等,则hashcode一定相等,反之则不然。

为何会有这样的要求?

在集合中,比如HashSet中,要求放入的对象不能重复,怎么判定呢?

首先会调用hashcode,如果hashcode相等,则继续调用equals,也相等,则认为重复。

如果重写equals后,如果不重写hashcode,则hashcode就是继承自Object的,返回内存编码,这时候可能出现equals相等,而hashcode不等,你的对象使用集合时,就会等不到正确的结果

    public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }


equals相等指的是“内容”相等,不重写equals是调用继承自Object的equals,而Object是用"=="实现的.。重写equals要根据自己要比较的对象来确定。Java API中对重写该方法作了说明:若重写equals就应该重写hashcode方法且hashcode方法与equals方法返回一致,即当equals返回true时,hashcode也要返回true。

自定义类一般都应该重写equals/hashCode。 Singleton 模式的类不必重写。

重写equals时重写hashCode应该是为了保证在集合类中的一致性。

是否相同,覆盖equals后,由你自己决定如何相等的

扩展阅读:java入门网站 ... javascript入门 ... javascript 在线 ... java版启动器下载 ... java windowbuilder ... minecraft国际版java版 ... equal ... java for ... java impl ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网