• Java中 hashCode()方法详解


    先来看下Object源码里hashcode方法:

      /**
         * Returns a hash code value for the object. This method is
         * supported for the benefit of hashtables such as those provided by
         * <code>java.util.Hashtable</code>.
         * <p>
         * The general contract of <code>hashCode</code> is:
         * <ul>
         * <li>Whenever it is invoked on the same object more than once during
         *     an execution of a Java application, the <tt>hashCode</tt> method
         *     must consistently return the same integer, provided no information
         *     used in <tt>equals</tt> comparisons on the object is modified.
         *     This integer need not remain consistent from one execution of an
         *     application to another execution of the same application.
         * <li>If two objects are equal according to the <tt>equals(Object)</tt>
         *     method, then calling the <code>hashCode</code> method on each of
         *     the two objects must produce the same integer result.
         * <li>It is <em>not</em> required that if two objects are unequal
         *     according to the {@link java.lang.Object#equals(java.lang.Object)}
         *     method, then calling the <tt>hashCode</tt> method on each of the
         *     two objects must produce distinct integer results.  However, the
         *     programmer should be aware that producing distinct integer results
         *     for unequal objects may improve the performance of hashtables.
         * </ul>
         * <p>
         * As much as is reasonably practical, the hashCode method defined by
         * class <tt>Object</tt> does return distinct integers for distinct
         * objects. (This is typically implemented by converting the internal
         * address of the object into an integer, but this implementation
         * technique is not required by the
         * Java<font size="-2"><sup>TM</sup></font> programming language.)
         *
         * @return  a hash code value for this object.
         * @see     java.lang.Object#equals(java.lang.Object)
         * @see     java.util.Hashtable
         */
        public native int hashCode();  

    根据上面的注释我们可以看到,在调用equals方法的时候会调用hashcode(),也就是我们重写equals()的时候也要重写hashCode()...

    我们在来看下hashTable的实现:

        /**
         * Returns the hash code value for this Map as per the definition in the
         * Map interface.
         *
         * @see Map#hashCode()
         * @since 1.2
         */
       // 计算Hashtable的哈希值

        public synchronized int hashCode() {
            /*
             * This code detects the recursion caused by computing the hash code
             * of a self-referential hash table and prevents the stack overflow
             * that would otherwise result.  This allows certain 1.1-era
             * applets with self-referential hash tables to work.  This code
             * abuses the loadFactor field to do double-duty as a hashCode
             * in progress flag, so as not to worsen the space performance.
             * A negative load factor indicates that hash code computation is
             * in progress.
             */
            int h = 0;
            if (count == 0 || loadFactor < 0)
                return h;  // Returns zero

            loadFactor = -loadFactor;  // Mark hashCode computation in progress
            Entry[] tab = table;
            for (int i = 0; i < tab.length; i++)
                for (Entry e = tab[i]; e != null; e = e.next)
                    h += e.key.hashCode() ^ e.value.hashCode();   //否则,返回“Hashtable中的每个Entry的key和value的异或值 的总和”。
            loadFactor = -loadFactor;  // Mark hashCode computation complete

        return h;
        }

     

    如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果,注:这里说的equals(Object) 方法是指Object类中未被子类重写过的equals方法。
    如果两个hashCode()返回的结果相等,则两个对象的equals方法不一定相等。
  • 相关阅读:
    浅谈软件开发项目的质量控制
    分布式系统稳定性模式
    正确使用 Volatile 变量
    我和 OI 的一些故事
    NOIP2020 退役记
    博弈论基础入门
    [HAOI2008]硬币购物(容斥/背包DP)
    [CF] 1307F Cow and Vacation(思维/贪心)
    [noi.ac 模拟赛8] c(容斥/DP)
    [noi.ac 模拟赛9] A.出征准备(同余最短路)
  • 原文地址:https://www.cnblogs.com/xiaoblog/p/4201337.html
Copyright © 2020-2023  润新知