1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-01 16:28:03 +08:00

Compare commits

..

3 Commits

Author SHA1 Message Date
Guide
f537c8a3fc Update java-collection-questions-02.md 2024-07-05 16:52:36 +08:00
Guide
e1439d8079
Merge pull request #2422 from gyaatrox/patch-1
Update memory-area.md
2024-07-05 16:38:02 +08:00
gyaatrox
c8803d3e5c
Update memory-area.md
格式问题
2024-07-05 13:41:27 +08:00
2 changed files with 2 additions and 1 deletions

View File

@ -23,6 +23,7 @@ head:
- **对 Null key 和 Null value 的支持:** `HashMap` 可以存储 null 的 key 和 value但 null 作为键只能有一个null 作为值可以有多个Hashtable 不允许有 null 键和 null 值,否则会抛出 `NullPointerException`
- **初始容量大小和每次扩充容量大小的不同:** ① 创建时如果不指定容量初始值,`Hashtable` 默认的初始大小为 11之后每次扩充容量变为原来的 2n+1。`HashMap` 默认的初始化大小为 16。之后每次扩充容量变为原来的 2 倍。② 创建时如果给定了容量初始值,那么 `Hashtable` 会直接使用你给定的大小,而 `HashMap` 会将其扩充为 2 的幂次方大小(`HashMap` 中的`tableSizeFor()`方法保证,下面给出了源代码)。也就是说 `HashMap` 总是使用 2 的幂作为哈希表的大小,后面会介绍到为什么是 2 的幂次方。
- **底层数据结构:** JDK1.8 以后的 `HashMap` 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8将链表转化为红黑树将链表转换成红黑树前会判断如果当前数组的长度小于 64那么会选择先进行数组扩容而不是转换为红黑树以减少搜索时间后文中我会结合源码对这一过程进行分析`Hashtable` 没有这样的机制。
- **哈希函数的实现**`HashMap` 对哈希值进行了高位和低位的混合扰动处理以减少冲突,而 `Hashtable` 直接使用键的 `hashCode()` 值。
**`HashMap` 中带有初始容量的构造函数:**

View File

@ -131,7 +131,7 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作 **GC 堆(
MaxTenuringThreshold of 20 is invalid; must be between 0 and 15
```
**为什么年龄只能是 0-15? **
**为什么年龄只能是 0-15?**
因为记录年龄的区域在对象头中,这个区域的大小通常是 4 位。这 4 位可以表示的最大二进制数字是 1111即十进制的 15。因此对象的年龄被限制为 0 到 15。