最近,一个业务需求需要对数量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
openjdk • Updated Dec 9, 2023
- 作者:Yibin
- 链接:https://yibin.dev/article/HashMap%E3%80%81ArrayList%E3%80%81HashSet%E7%9A%84contains%E5%AF%B9%E6%AF%94
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章







