2的n次方表格

目录

 小技巧


 做项目的时候有时候会担心数据溢出,常用的数据长度就有8位、16位、32位、64位。相信八位都很容易记住就是256,16位是65536,但是数字一大就记不住了,甚至连换算为十进制是多少位都不得而知。

下表中就有1 ~ 64位数据的范围。

0次方:1
1次方:2
2次方:4
3次方:8
4次方:16
5次方:32
6次方:64
7次方:128
8次方:256
9次方:512
10次方:1024
11次方:2048
12次方:4096
13次方:8192
14次方:16384
15次方:32768
16次方:65536
17次方:131072
18次方:262144
19次方:524288
20次方:1048576
21次方:2097152
22次方:4194304
23次方:8388608
24次方:16777216
25次方:33554432
26次方:67108864
27次方:134217728
28次方:268435456
29次方:536870912
30次方:1073741824
31次方:2147483648
32次方:4294967296
33次方:8589934592
34次方:17179869184
35次方:34359738368
36次方:68719476736
37次方:137438953472
38次方:274877906944
39次方:549755813888
40次方:1099511627776
41次方:2199023255552
42次方:4398046511104
43次方:8796093022208
44次方:17592186044416
45次方:35184372088832
46次方:70368744177664
47次方:140737488355328
48次方:281474976710656
49次方:562949953421312
50次方:1125899906842624
51次方:2251799813685248
52次方:4503599627370496
53次方:9007199254740992
54次方:18014398509481984
55次方:36028797018963968
56次方:72057594037927936
57次方:144115188075855872
58次方:288230376151711744
59次方:576460752303423488
60次方:1152921504606846976
61次方:2305843009213693952
62次方:4611686018427387904
63次方:9223372036854775808
64次方:18446744073709551616

 小技巧

有一个记忆2进制的小技巧哦,博主小时候一直就在想为什么手机的1kb不是1000b,而是1024

b,学习了计算机之后才得知,1kb是2^10b。这就很好记忆了吧。2^20次方就是1Mb。

### 3.1 HashMap 的表格实现原理 `HashMap` 是基于哈希表(散列表)实现的 `Map` 接口,其核心思想是通过键的哈希值来快速定位存储位置,从而实现高效的插入、查找和删除操作。内部结构由一个 `Node<K,V>[]` 类型的数组构成,每个数组元素称为“桶”(bucket)。当插入键值对时,会根据键的哈希值计算出对应的索引位置,并将键值对封装成 `Node` 对象存入该桶中。 如果多个键的哈希值相同(即发生哈希冲突),则使用链表或红黑树来组织这些节点。在 JDK 1.8 中,当链表长度超过阈值(默认为 8)时,链表会转换为红黑树以提高查找效率;而当树的节点数小于阈值(默认为 6)时,又会退化为链表[^3]。 ```java static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); // 哈希扰动函数 } ``` 上述方法用于计算键的哈希值,目的是减少哈希冲突的概率。它通过将键的 `hashCode()` 与其右移 16 位后的结果进行异或运算,使得高位信息参与索引计算,提升哈希分布的均匀性[^3]。 ### 3.2 HashMap 的寻址算法 在 `HashMap` 中,键的哈希值经过扰动处理后,再与 `(n - 1)` 进行按位与运算,其中 `n` 是数组的长度。这种设计确保了索引值在数组范围内,同时由于 `n` 通常为 2 的幂次方,`(n - 1)` 的二进制表示全是 1,这样可以保证每一位都能被充分利用,从而减少哈希冲突[^4]。 ```java int index = (n - 1) & hash; ``` 当两个键通过 `hashCode` 计算得到相同的索引值时,就会发生哈希冲突。此时,`HashMap` 使用链表(拉链法)来解决冲突,将新插入的节点作为链表头节点,旧节点放在新节点的 `next` 指针中。这种设计避免了频繁遍历链表尾部插入带来的性能开销,充分发挥了链表插入效率高的优势。 ### 3.3 HashMap 的使用方法 `HashMap` 提供了丰富的 API 来操作键值对,包括插入、查询、删除等操作: ```java Map<String, Integer> map = new HashMap<>(); map.put("a", 1); map.put("b", 2); // 获取值 Integer value = map.get("a"); // 删除键值对 map.remove("b"); // 遍历方式推荐使用 entrySet() for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + " -> " + entry.getValue()); } ``` 此外,`HashMap` 不是线程安全的。在多线程环境下并发修改可能会导致数据不一致甚至死循环等问题。若需要线程安全的实现,可以考虑使用 `ConcurrentHashMap` 或者通过 `Collections.synchronizedMap()` 方法包装为同步版本[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值