随笔 - 4, 文章 - 0, 评论 - 1, 引用 - 0
1 简介
在日常开发中,ArrayList
和HashSet
都是Java中很常用的集合类。
ArrayList
是List
接口最常用的实现类;HashSet
则是保存唯一元素Set
的实现。
本文主要对两者共有的方法contains()
做一个简单的讨论,主要是性能上的对比,并用JMH(ava Microbenchmark Harness)
进行测试比较。
2 先看JMH测试结果
我们使用一个由OpenJDK/Oracle里面开发了Java编译器的大牛们所开发的Micro Benchmark Framework
来测试。下面简单展示一下使用过程。
2.1 Maven导入相关依赖
导入JMH
的相关依赖,可以去官网查看最新版本:
<dependencies> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>${openjdk.jmh.version}</version> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>${openjdk.jmh.version}</version> </dependency> </dependencies> <properties> <openjdk.jmh.version>1.19</openjdk.jmh.version> </properties>
2.2 创建测试相关的类
2.2.1 集合储存对象的类
因为要测试集合类的方法,所以我们创建一个类来表示集合所储存的对象。如下:
@Data @AllArgsConstructor(staticName = "of") public class Student { private Long id; private String name; }
2.2.2 JMH测试类
接下来我们就来写测试性能对比的类,代码如下:
@BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class ContainsPerformanceTest { @State(Scope.Thread) public static class MyState { private Set<Student> studentSet = new HashSet<>(); private List<Student> studentList = new ArrayList<>(); private Student targetStudent = Student.of(99L, "Larry"); @Setup(Level.Trial) public void prepare() { long MAX_COUNT = 10000; for (long i = 0; i < MAX_COUNT; i++) { studentSet.add(Student.of(i, "MQ")); studentList.add(Student.of(i, "MQ")); } studentList.add(targetStudent); studentSet.add(targetStudent); } } @Benchmark public