1 简介

在日常开发中,ArrayListHashSet都是Java中很常用的集合类。

  • ArrayListList接口最常用的实现类;
  • 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