一些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)publicvoidwithoutCap(){Mapmap=newHashMap<>();for(inti=0;imap=newHashMap<>(CAP);for(inti=0;iMAXIMUM_CAPACITY)initialCapacity=MAXIMUM_CAPACITY;if(loadFactor<=0||FloatloadFactor))thrownewIllegalArgumentException("非法加载因子:"+loadFactor);this.loadFactor=loadFactor;this.threshold=tableSizeFor(initialCapacity);}staticfinalinttableSizeFor(intcap){intn=-1>>>Integer.numberOfLeadingZeros(cap-1);返回(n<0)?1:(n>=MAXIMUM_CAPACITY)?最大容量:n+1;}不指定capacity时,构造函数中只有一行this.loadFactor=DEFAULT_LOAD_FACTOR;,当put数据量一致时,后续所有代码执行过程都是一致的,所以在指定容量时,上面的容量参数检查代码带来了额外的性能负担,所以数据量比较大的时候以小时为单位指定容量,性能更差最后,回到文章标题,在Java中使用HashMap时,指定初始容量的性能一定更好吧?答案不一定,指定的容量也可能性能更差。当然,大多数情况下还是建议指定容量,类似于ArrayList,也是建议指定容量。别人给出的结论不一定完全正确。只有知道得出结论的原因,才能更有效地利用结论。