@startuml
!pragma layout smetana
skinparam backgroundColor #FFFFFF
skinparam shadowing false
skinparam defaultFontName "PingFang SC"
skinparam rectangle {
  RoundCorner 8
  BorderColor #2F5597
}
skinparam class {
  BorderColor #2F5597
  BackgroundColor #F5F9FF
}
title HashMap（哈希映射）桶结构与扩容拆分

rectangle "table（桶数组）\n容量：16" as table #E8F1FF {
  rectangle "槽位 0\nnull（空值）键" as b0 #FFFFFF
  rectangle "槽位 3\n链表桶" as b3 #FFFFFF
  rectangle "槽位 7\n空桶" as b7 #FFFFFF
  rectangle "槽位 11\nTreeNode（树节点）桶" as b11 #FFFFFF
}

rectangle "Node（节点）A\nhash：0x23\n键：库存键 A\n值：12\n后继：Node（节点）B" as n1 #F5F9FF
rectangle "Node（节点）B\nhash：0x13\n键：库存键 B\n值：8\n后继：null（空值）" as n2 #F5F9FF

rectangle "TreeNode（树节点）根\nhash：0x0B\n键和值\n颜色：黑色" as tRoot #FFF3E0
rectangle "TreeNode（树节点）左\nhash：0x1B\n颜色：红色" as tLeft #FFEBEE
rectangle "TreeNode（树节点）右\nhash：0x2B\n颜色：红色" as tRight #FFEBEE

b3 --> n1 : 首节点
n1 --> n2 : next（后继引用）
b11 --> tRoot : 根节点
tRoot --> tLeft : 左子节点
tRoot --> tRight : 右子节点

rectangle "旧容量 16 的槽位 j" as old #E8F1FF
rectangle "新容量 32 的槽位 j\n低位组：hash（哈希） & 16 = 0" as low #E8F1FF
rectangle "新容量 32 的槽位 j + 16\n高位组：hash（哈希） & 16 != 0" as high #E8F1FF
old --> low : 保持原索引
old --> high : 移动 16

note bottom of table
空桶没有节点；链表用于少量冲突；
桶过长且容量足够时转为红黑树。
end note
@enduml
