• 判断一个数是否是偶数,你真的仔细去考虑过么


       怎样判断一个数是否是偶数,正常学的差不多的都会知道说用这个数去%2,我们可以挖一下,这个模2是怎么出来的,是通过&1,这个是底层的算法,然后我们再挖深下,&1的底层是,假如3&1也就是011和001做与运算,二进制转换十进制怎么整的,不就是2的n-1次方么,所以只要计算第一位的与运算就知道这个数是否是奇数还是偶数了

      其实Javase的一些源码也可以看到很多这些影子,

      static int hash(int h) {
            // This function ensures that hashCodes that differ only by
            // constant multiples at each bit position have a bounded
            // number of collisions (approximately 8 at default load factor).
            h ^= (h >>> 20) ^ (h >>> 12);
            return h ^ (h >>> 7) ^ (h >>> 4);
        }
    
        /**
         * Returns index for hash code h.
         */
        static int indexFor(int h, int length) {
            return h & (length-1);
        }
      public V put(K key, V value) {
            if (key == null)
                return putForNullKey(value);
    //将key做hash算法
    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; }
    
    
    
     

         从这段代码可以看出,hashmap通过将key做hash算法,然后通过hash值映射到内存地址,取得key所对应的数据。平时都知道hashMap的底层数据结构用的是数组,这么整下来数组的下标索引也就是内存地址了,通过上述代码看到hash()的实现全部基于位运算,而位运算比算数,逻辑运算快,通过indexFor()将hash值与数组长度按位取与得到数组索引,返回数组的索引直接通过数组下标便可以取得对应的值,内存访问的速度也快,也可以看到hashMap的性能可见一斑

          通过判断某个数是否是偶数,去理解indexFor()到底为何这么用,这就是为何说源码是最好的教科书的所在

  • 相关阅读:
    包和常用内置模块(二)
    常用内置模块(一)
    正则表达式和re模块
    迭代器和生成器
    函数(四)
    函数(三)闭包函数与装饰器
    Codeforces Round #539 (Div. 2) D 思维
    Codeforces Round #539 (Div. 2) 异或 + dp
    Codeforces Round #546 (Div. 2) E 推公式 + 线段树
    牛客练习赛42 C 反着计算贡献
  • 原文地址:https://www.cnblogs.com/yinchen/p/5326826.html
Copyright © 2020-2023  润新知