一些Java编程老手在做CodeReview时,都会告诉其他人,使用HashMap时建议指定容量大小,原因是指定容量后,代码性能会更好一些。后来随着阿里Java开发手册在业内广为传播,这一点早已深入人心,我自己也早已习惯在使用HashMap时指定容量大小。但我今天突发奇想,想知道指定容量和不指定容量时性能究竟有多少的差异,测试部分测试数据的结果让我大跌眼睛,有些情况下指定容量的性能还比不指定容量时差!! ,但其他部分还是很符合我之前的认知的。
先说下我的测试平台和测试方法,我使用了openjdk17和jmh单线程测试,测试代码如下:
@Benchmark
@BenchmarkMode(Mode.Throughput)
@Measurement(iterations = 2, time = 5)
@Threads(1)
@Fork(0)
@Warmup(iterations = 1, time = 5)
public void withoutCap() {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < CAP; i++) {
map.put(random.nextInt(), 1);
}
}
@Benchmark
@BenchmarkMode(Mode.Throughput)
@Measurement(iterations = 2, time = 5)
@Threads(1)
@Fork(0)
@Warmup(iterations = 1, time = 5)
public void withCap() {
Map<Integer, Integer> map = new HashMap<>(CAP);
for (int i = 0; i < CAP; i++) {
map.put(rand

文章探讨了在Java编程中使用HashMap时指定容量与不指定容量对性能的差异。通过JMH测试,发现在数据量大于16时,指定容量通常带来更好的性能,但小于16时,不指定容量可能更优。这与HashMap的扩容机制有关,不指定容量可能导致频繁扩容和数据迁移。然而,在小数据量情况下,指定容量的构造函数检查造成了额外开销,从而性能下降。结论是,指定容量并不总是性能提升,需根据实际情况选择。
最低0.47元/天 解锁文章
8418

被折叠的 条评论
为什么被折叠?



