我们先来上一段测试代码,直观感受一下 HashMap 的真实的扩容过程:
package i
import java.util.*
/**
* @author: Jack
* 2020-03-21 21:55
*/
fun main(args: Array<String>) {
val map = HashMap<String, Int>(2)
val clz = map::class.java
val capacity = clz.getDeclaredMethod("capacity")
capacity.isAccessible = true
val size = clz.getDeclaredMethod("size")
size.isAccessible = true
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
map["a"] = 1
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
map["b"] = 2
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
map["c"] = 3
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
map["ab"] = 12
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
map["bc"] = 23
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
map["abc"] = 123
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
map["abcd"] = 1234
println("capacity=${capacity.invoke(map)}")
println("size=${size.invoke(map)}")
println(map)
}
输出:
capacity=2
size=0
{}
capacity=2
size=1
{a=1}
capacity=4
size=2
{a=1, b=2}
capacity=4
size=3
{a=1, b=2, c=3}
capacity=8
size=4
{a=1, ab=12, b=2, c=3}
capacity=8
size=5
{a=1, ab=12, bc=23, b=2, c=3}
capacity=8
size=6
{a=1, ab=12, bc=23, b=2, c=3, abc=123}
capacity=16
size=7
{a=1, ab=12, bc=23, b=2, c=3, abc=123, abcd=1234}
作者:一个会写诗的程序员
链接:https://cloud.tencent.com/developer/article/1603892
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。