hashMap 临界值初步理解

Posted hellowzd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hashMap 临界值初步理解相关的知识,希望对你有一定的参考价值。

import java.util.*;

public class Bs {


    //Integer.highestOneBit((number - 1) << 1)分解
    
    public static void main(String []args) {
        
       //number(hashMap需要多大的长度,先简单的理解为table.length)
       int a = 1;//根据传入的table.length=1,计算这个hashMap需要多大的长度
       int b = 3;
       int c = 5;
       int d = 8;
       System.out.println("初始结果----------------------------------");
       System.out.println(Integer.toBinaryString(a));//1
       System.out.println(Integer.toBinaryString(b));//11
       System.out.println(Integer.toBinaryString(c));//101
       System.out.println(Integer.toBinaryString(d));//1000
       System.out.println("");
       
       //number - 1 ****************************************************为什么减1?
       int a1 = 1-1;
       int b1 = 3-1;
       int c1 = 5-1;
       int d1 = 8-1;
       
       //number
       //int a1 = 1; //不减1最终的结果是1-->2;应该是1
       //int b1 = 3; //不减1最终的结果是3-->4;应该是4
       //int c1 = 5; //不减1最终的结果是5-->8;应该是8
       //int d1 = 8; //不减1最终的结果是8-->16;应该是8
                     
                     //为什么减1
                     //如果这个数为奇数,减1后是比它小1的偶数,这个偶数是2的倍数,如果乘2,可能恰好是一个2的次方
                     //如果这个数为偶数,可能本身它就是一个2的次方,那么通过下面的移位算法,计算出来的空间就会大,浪费空间
       
       System.out.println("减1结果----------------------------------");
       System.out.println(Integer.toBinaryString(a1));//0
       System.out.println(Integer.toBinaryString(b1));//10
       System.out.println(Integer.toBinaryString(c1));//100
       System.out.println(Integer.toBinaryString(d1));//111
       System.out.println("");
       
       //(number - 1) << 1 ****************************************************为什么左移?
       
                //为什么左移
                //<<:左移运算符,num << 1,相当于num乘以2
                //左移后低位是由0来补充的
                //JAVA中没有<<<的,因为左移后低位肯定是由0来补充的

                        
       int a2 = a1 << 1;
       int b2 = b1 << 1;
       int c2 = c1 << 1;
       int d2 = d1 << 1;
       System.out.println("左移结果----------------------------------");
       System.out.println(Integer.toBinaryString(a2));//0
       System.out.println(Integer.toBinaryString(b2));//100
       System.out.println(Integer.toBinaryString(c2));//100
       System.out.println(Integer.toBinaryString(d2));//1110
       System.out.println("");
       
       System.out.println("最终结果----------------------------------");
       System.out.println("");
       //Integer.highestOneBit((number - 1) << 1) ****************************************************为什么取111的形式然后做了个减法运算?
       int a3 = highestOneBit(a2);
       int b3 = highestOneBit(b2);
       int c3 = highestOneBit(c2);
       int d3 = highestOneBit(d2);
       System.out.println("1--->"+a3);
       System.out.println("3--->"+b3);
       System.out.println("5--->"+c3);
       System.out.println("8--->"+d3);
       System.out.println("");
       
       System.out.println("修正0值----------------------------------");       
       int fix = 1 >= (1 << 30)
                ? (1 << 30) 
                : (1 > 1) ? 0 : 1;
                
       int f1 = (1 > 1) ? 0 : 1;
       System.out.println("1--->"+f1);    
       int f2 = 1 >= (1 << 30) ? (1 << 30) : 1;
       System.out.println("2--->"+f2);       
       System.out.println("3--->"+fix);
       System.out.println("");
       
       int a4 = 1;//1
       int b4 = 4;//3
       int c4 = 8;//5
       int d4 = 8;//8
       System.out.println("理想结果----------------------------------");
       System.out.println(Integer.toBinaryString(a4));//10
       System.out.println(Integer.toBinaryString(b4));//100
       System.out.println(Integer.toBinaryString(c4));//100
       System.out.println(Integer.toBinaryString(d4));//1000  
       System.out.println("");
       System.out.println("1--->"+a4);
       System.out.println("3--->"+b4);
       System.out.println("5--->"+c4);
       System.out.println("8--->"+d4);
       System.out.println("");    
       
       
       
    }
    
    
    
    public static int highestOneBit(int i) {
        // HD, Figure 3-1
        System.out.println("右移结果");
        i |= (i >>  1);
                //>>:右移运算符,num >> 1,相当于num除以2
                //表示右移,如果该数为正,则高位补0,若为负数,则高位补1
        System.out.println("1--->"+Integer.toBinaryString(i));
        i |= (i >>  2);
        System.out.println("2--->"+Integer.toBinaryString(i));
        i |= (i >>  4);
        System.out.println("3--->"+Integer.toBinaryString(i));
        i |= (i >>  8);
        System.out.println("4--->"+Integer.toBinaryString(i));
        i |= (i >> 16);
        System.out.println("5--->"+Integer.toBinaryString(i));
        
        System.out.println("6--->"+Integer.toBinaryString(i >>> 1)+"(无符号右移)");
                //>>>:无符号右移,忽略符号位,空位都以0补齐
                //表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
        System.out.println("7--->"+Integer.toBinaryString(i - (i >>> 1))+"(减法运算)");
        System.out.println("");
        
        return i - (i >>> 1);
    }

    
    //所以右移就是一个整除2的过程,右移一位就是除一次,n位就是除n次。
    //可以看出>>1则除以2,>>2则除以2在除以2.后面以此类推
    
    //3
    //((((((3-1)*2)/2)/2)/2)/2)...
    
    //任何一个数,只能通过加减和乘除2的操作,得出比它大,且离它最近的2的次方数
    

} 

 

以上是关于hashMap 临界值初步理解的主要内容,如果未能解决你的问题,请参考以下文章

HashMap原理:哈希函数的设计

Java中HashMap和TreeMap的区别深入理解

HashMap底层源码解析上(超详细图解+面试题)

java.util.HashMap

为什么HashMap建议初始化容量,且容量为2的次幂?

Java中HashMap和TreeMap的区别深入理解