🤔
最近,一个业务需求需要对数量1w左右的id进行存在判断,就大概研究了下几个常用判断存在的Java方法的性能差异。
 

🍒 测试环境

JDK 版本为1.8(问就是生产还用1.8
操作系统 Windows 10企业版
JMH版本为1.36

🍖 测试代码

 
分别测试10,1000,10000,100000数量的ArrayList、HashSet、HashMap判断1w个key是否存在。
单个key为16字节的字符串。

🍑 结果

从结果来看,HashSet.contains()= HashMap.containsKey() > ArrayList.contains() > HashMap.containsValue()
不管数据量大小,HashSet.contains()、HashMap.containsKey()都比其他两个快了不止一个数量级,所以在一些高频判断存在的场景,尽量使用HashSet或HashMap。

🍉 源码

从源码中可以看出,ArrayList.contains和HashMap.containsValue效率慢都是因为需要遍历整个列表。
而HashSet.contains本质上就是HashMap.containsKey,所以二者判断效率是一样的。

🥑 参考资料

jmh
openjdkUpdated Dec 9, 2023
Java中HashMap指定初始化容量,各种for循环语法糖性能测试关于Notion搭建blog的相关记录
Loading...