比较 Java 中的 Map.of() 和新的 HashMap()

Java 是一种流行的编程语言,用于开发各种应用程序,包括 Web、移动和桌面应用程序。它为开发人员提供了许多有用的数据结构,供其程序使用,其中之一是接口。该接口用于以键值对存储数据,使其成为许多应用程序的基本数据结构。MapMap

在本文中,我们将讨论 Java 中的用法和新功能、它们之间的区别以及使用 .Map.of()HashMap<>()Map.of()

什么是 map.of()?

Map.of()是 Java 9 中引入的一种方法,它允许开发人员创建最多包含 10 个键值对的不可变映射。

它提供了一种方便简洁的地图创建方式,无需编写大量代码即可更轻松地创建小地图。 是对以前使用类的构造函数创建小地图的方式的改进,这种方式可能既繁琐又冗长。Map.of()HashMap

什么是新的HashMap<>()?

new 是 Java 中类提供的构造函数,它允许开发人员创建 .它用于创建可变映射,这意味着可以通过添加、删除或更新键值对来修改映射。HashMap<>() HashMapHashMap

它是在 Java 中创建地图的常用方法,尤其是在处理较大的数据集时。

Benchmarking Map.of() 和 new HashMap<>()

为了比较 Java 的性能,我们可以使用基准测试工具来测量在使用这些方法创建的地图上执行各种操作所需的时间。在我们的基准测试中,我们将测量从地图中获取值所花费的时间以及将值插入地图所花费的时间。Map.of()new HashMap<>()

值得注意的是,我们的基准仅限于一小部分数据,例如十个项目。对于较大的数据集或更复杂的用例,结果可能会有所不同。

package ca.bazlur;

import org.openjdk.jmh.annotations.Benchmark;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@State(Scope.Benchmark)
@Warmup(iterations = 5, time = 1)
@Measurement(iterations = 20, time = 1)
@Fork(1)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@OperationsPerInvocation
public class MapBenchmark {
    private static final int SIZE = 10;

    private Map mapOf;
    private Map hashMap;

    @Setup
    public void setup() {
        mapOf = Map.of(
                0, "value0",
                1, "value1",
                2, "value2",
                3, "value3",
                4, "value4",
                5, "value5",
                6, "value6",
                7, "value7",
                8, "value8",
                9, "value9"
        );

        hashMap = new HashMap<>();

        hashMap.put(0, "value0");
        hashMap.put(1, "value1");
        hashMap.put(2, "value2");
        hashMap.put(3, "value3");
        hashMap.put(4, "value4");
        hashMap.put(5, "value5");
        hashMap.put(6, "value6");
        hashMap.put(7, "value7");
        hashMap.put(8, "value8");
        hashMap.put(9, "value9");
    }

    @Benchmark
    public void testMapOf(Blackhole blackhole) {
        Map map = Map.of(
                0, "value0",
                1, "value1",
                2, "value2",
                3, "value3",
                4, "value4",
                5, "value5",
                6, "value6",
                7, "value7",
                8, "value8",
                9, "value9"
        );
        blackhole.consume(map);
    }


    @Benchmark
    public void testHashMap(Blackhole blackhole) {
        Map hashMap = new HashMap<>();
        hashMap.put(0, "value0");
        hashMap.put(1, "value1");
        hashMap.put(2, "value2");
        hashMap.put(3, "value3");
        hashMap.put(4, "value4");
        hashMap.put(5, "value5");
        hashMap.put(6, "value6");
        hashMap.put(7, "value7");
        hashMap.put(8, "value8");
        hashMap.put(9, "value9");
        blackhole.consume(hashMap);
    }

    @Benchmark
    public void testGetMapOf() {
        for (int i = 0; i < 10; i++) {
            mapOf.get(i);
        }
    }

    @Benchmark
    public void testGetHashMap() {
        for (int i = 0; i < SIZE; i++) {
            hashMap.get(i);
        }
    }
}

Benchmark                    Mode  Cnt   Score   Error  Units
MapBenchmark.testGetHashMap  avgt   20  14.999 ± 0.433  ns/op
MapBenchmark.testGetMapOf    avgt   20  16.327 ± 0.119  ns/op
MapBenchmark.testHashMap     avgt   20  84.920 ± 1.737  ns/op
MapBenchmark.testMapOf       avgt   20  83.290 ± 0.471  ns/op

这些是比较使用 和 在 Java 中的性能的基准测试结果。基准测试是使用有限和小数据集进行的。new HashMap<>()Map.of()10

这些结果表明,与使用 创建的不可变 s 相比,s 的操作速度略快。

根据您的 JDK 发行版和计算机,当您尝试基准测试结果时,它们可能会略有不同。但是,在大多数情况下,结果应该是一致的。

此外,请记住,微观基准应始终持保留态度,而不是用作做出决定的唯一因素。还应考虑其他因素,例如内存使用情况、线程安全性和代码的可读性。

源代码可以在GitHub上找到。

在我看来,在大多数情况下,性能的微小变化可能并不重要。在 和 之间做出决定时,必须考虑其他方面,例如特定用例、简洁程度、组织良好的代码以及首选功能(例如,可变或不可变性质)。对于简单的方案,在简单性和简洁性方面可能仍然占上风。HashMapMap.of()Map.of()

因此,让我们看看使用.Map.of()

使用 Map.of() 的好处

在 Java 中使用新功能有几个好处:Map.of()HashMap<>()

  • 简洁:提供在 Java 中创建小地图的简洁方便的方法。这使得代码更具可读性且更易于维护。Map.of()
  • 不可变性:创建不可变映射,这意味着一旦创建映射,就无法对其进行修改。这为地图中存储的数据提供了一定程度的安全性。Map.of()
  • 类型安全:为映射的键和值提供类型安全,这有助于防止在使用 new .Map.of()HashMap<>()

结论

Map.of()是 Java 9 中引入的一种强大而有用的方法,它提供了一种更简洁的方法来在 Java 中创建小映射,并具有不可变性和类型安全等附加优势。

我们的基准测试表明,小地图的延迟和新地图的延迟非常接近,误差线重叠,这使得仅凭这些数据很难明确地得出结论,一种方法明显快于另一种方法。Map.of()HashMap<>()

使用的好处包括其简洁性、不变性和类型安全性。尽管根据提供的基准测试结果,性能差异可能并不显着,但其其他优点使其成为一个有吸引力的选择。Map.of()Map.of()

开发人员在 Java 中创建小地图时应考虑使用,以利用这些优势。Map.of()

你可能感兴趣的:(java,开发语言)