zoukankan      html  css  js  c++  java
  • 判断一个数是否是偶数,你真的仔细去考虑过么

       怎样判断一个数是否是偶数,正常学的差不多的都会知道说用这个数去%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()到底为何这么用,这就是为何说源码是最好的教科书的所在

  • 相关阅读:
    2021 Duilib最新入门教程(二)Duilib编译动态库
    2021 Duilib最新入门教程(一)Duilib简介
    webgl图库选型
    CUDA编程学习记录
    C++时间戳获取
    FFMPEG编译问题记录
    程序员的35岁
    Linux发行版及其目标用户
    服务器关机或重启
    Linux下找出吃内存的方法总结
  • 原文地址:https://www.cnblogs.com/yinchen/p/5326826.html
Copyright © 2011-2022 走看看