hashCode 牛角尖

hashCode有什么用?java doc里面说的很清楚了:

  • 1:在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。(同一对象多次调用hashCode应该是相同的。)
  • 2:如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 equals比较相同的对象,hashCode应该相同)
  • 3:以下情况 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。(这句话的意思是不同的对象,他们的hashCode可以是相同的。)

    对于使用hash来判断的集合来说,还是直接看源码比较清楚,以hashmap来说:

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

    public V get(Object key) {
            if (key == null)
                return getForNullKey();
            int hash = hash(key.hashCode());
            for (Entry<K,V> e = table[indexFor(hash, table.length)];
                 e != null;
                 e = e.next) {
                Object k;
                if (

    e.hash == hash && ((k = e.key) == key || key.equals(k)))
    return e.value;
    }
    return null;
    }

     

    看清楚了,是先比较hashcode再比较equal,当然,一旦hashcode不同,短路后那么equal就不会判断了。

    这就揭开了我的牛角尖,不同类型的对象hashcode相同怎么办?

    不同类型对象即使hashcode存在偶然相同的可能,equal理论上是应该不同的。在实现hashcode时,只要考虑同一类型中不同即可,不必要做到UUID的级别!

    那么就别把hashcode当UUID使用了!


  • Total views.

    © 2013 - 2024. All rights reserved.

    Powered by Hydejack v6.6.1