一篇搞懂HashMap,手写HashMap

HashMap核心原理

预备知识

1. 算法复杂度:大 O 表示法

  • 大O表示法是一种特殊的表示法,指出了算法的速度有多快。
  • O(n):表示该算法需要计算n次,比如常见的for循环:
//n是正整数,这个for循环需要循环n次,算法复杂度就是O(n)
for(int i=0;i<n;i++){
   
  ...
}
  • O(1):无论多少元素参与运算,复杂度始终是计算一次,这个就是典型的最优解。例如查找数组元素:
//获取数组中某个元素,直接找到数组下标就可以获取,不需要循环,这个算法复杂度就是O(1)
int[] a ={
   1,2,3,4,5};
a[0];

2. 位运算

  • 二进制的位运算包括(&、|、^、~、>>、<<、>>>),这种运算速度很快。
  • 1 btye(字节)=8 bit(位),一个8bit就可以表示一个二进制,例如 0000 0010
  • &(与运算): 两个位都为1时,结果才为1。例如:
//3&5的二进制: 
0000 0011 & 0000 0101 = 0000 0001 ,因此 3&5 的值得1//与运算常用用途:清零,如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
//HashMap源码中putval方法用到了与运算(计算数组索引:(n - 1) & hash , n是2的倍数的正整数),例如16,hash是计算hash值,计算后获得是一个正整数,这个公式最后计算结果等同求余数,例如(16-1)& 506434430 = 14,意思就是获得余数14,这个余数就是hashmap放入元素在数组中的索引位置(后面详解)

  • | (或运算): 两个位都为0时,结果才为0
3|50000 0011| 0000 0101 = 0000 0111,因此,3|5的值得7。 
//或运算常用来对一个数据的某些位设置为1
//HashMap中tableSizeFor(int cap)方法用到了或运算,目的是找到最接近用户指定集合大小cap的2的n次方的整数,例如cap=99时候,该方法计算出128是最接近99且是2的n次方的数
  • ^(异或运算):两个位相同为0,相异为1
运算规则:0^0=0  0^1=1  1^0=1  1^1=0
//常常用于翻转指定位
  • <<(左移): 各二进位全部左移若干位,高位丢弃,低位补0
1<<2  结果4,相当于1×2^2

可以约等同这个公式:
1 < < n = 1 × 2 n 1<<n = 1×2^n 1<<n=1×2n

  • >>(右移): 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移)
100>>2  结果25,相当于100÷2^2

可以约等同这个公式:
100 > > n = 100 ÷ 2 n 100>>n = 100÷2^n 100>>n=100÷2

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值