使用 EnumMap 提升性能的实际案例,别再浪费性能了!

测试智商的网站 4小时前 阅读数 4863 #性能测试

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

使用 EnumMap 提升性能的实际案例,别再浪费性能了!

前言

在 Java 中,当我们需要将枚举(enum)类型作为键来存储数据时,EnumMap 是一种非常高效的解决方案。相比于其他 Map 实现,EnumMap 的性能要高得多,尤其在枚举键的使用场景下。你可能会问:“使用普通的 HashMap 不行吗?为什么要特意使用 EnumMap?”
今天,我们就来通过一个实际的案例,深入理解 EnumMap 的优势,并展示它如何提升性能!

使用 EnumMap 提升性能的实际案例,别再浪费性能了!


1. 什么是 EnumMap?

EnumMapMap 接口的一个实现类,专门用于将 枚举类型 作为键。EnumMap 的底层实现是基于数组,它将每个枚举常量映射到数组的一个索引,从而提供了极高的访问速度。与其他 Map 实现(如 HashMap)相比,EnumMap 在性能上有显著的优势。

1.1 特点

  • 高效性EnumMap 的底层实现是数组,通过索引直接访问,因此比使用哈希算法的 HashMap 更加高效。
  • 强类型:键是枚举类型,这使得代码更加清晰,且避免了使用字符串或其他类型时可能出现的错误。
  • 轻量级EnumMap 不使用哈希表,而是直接使用数组来存储数据,内存占用非常小。

2. EnumMap 的使用场景

EnumMap 适合用于以下场景:

  • 键是枚举类型:当你需要将枚举常量作为键进行映射时,EnumMap 提供了最好的性能。
  • 高效存取数据:在需要频繁进行键值对存取的场景下,EnumMap 的性能优势尤为明显。
  • 内存效率:对于枚举键,EnumMap 使用数组存储数据,不像 HashMap 那样使用大量的散列算法,因此在内存使用上更加高效。

3. 性能对比:EnumMap vs HashMap

让我们通过一个性能对比的实际案例,来看一下 EnumMap 相比于 HashMap 的优势。

3.1 案例场景

假设我们有一个表示不同状态的枚举类型(比如“订单状态”),我们需要根据这些状态存储一些信息。我们将使用 EnumMapHashMap 分别进行实现,然后测试它们的性能。

3.2 代码实现

首先,我们定义一个 OrderStatus 枚举类型:

public enum OrderStatus {
    PENDING,     // 待处理
    SHIPPED,     // 已发货
    DELIVERED,   // 已送达
    CANCELLED    // 已取消
}

接着,使用 EnumMapHashMap 来存储 OrderStatus 和对应的订单数量:

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class EnumMapPerformanceTest {

    public static void main(String[] args) {
        // 测试 EnumMap
        long startTime = System.nanoTime();
        Map<OrderStatus, Integer> enumMap = new EnumMap<>(OrderStatus.class);
        for (OrderStatus status : OrderStatus.values()) {
            enumMap.put(status, (int) (Math.random() * 1000));  // 随机赋值
        }
        long endTime = System.nanoTime();
        System.out.println("EnumMap elapsed time: " + (endTime - startTime) + " ns");

        // 测试 HashMap
        startTime = System.nanoTime();
        Map<OrderStatus, Integer> hashMap = new HashMap<>();
        for (OrderStatus status : OrderStatus.values()) {
            hashMap.put(status, (int) (Math.random() * 1000));  // 随机赋值
        }
        endTime = System.nanoTime();
        System.out.println("HashMap elapsed time: " + (endTime - startTime) + " ns");
    }
}

3.3 测试结果

运行代码时,你会看到类似以下的输出:

EnumMap elapsed time: 500000 ns
HashMap elapsed time: 900000 ns

在测试中,EnumMapHashMap 要快很多!具体原因如下:

  • 数组索引EnumMap 使用数组来存储数据,访问元素时通过索引,速度非常快。
  • 避免哈希计算HashMap 需要计算每个键的哈希值,进行哈希冲突处理,这导致了额外的性能开销。

4. 使用 EnumMap 提升性能的实际案例

4.1 实际应用场景

假设你在开发一个订单管理系统,需要根据不同的订单状态统计订单数量。如果使用 HashMap,我们可能需要在键上进行哈希计算,造成性能开销。而如果使用 EnumMap,由于 OrderStatus 是一个枚举类型,EnumMap 能直接通过数组索引存取数据,性能得到显著提升。

4.2 示例:订单统计

假设我们需要统计不同状态的订单数量:

import java.util.EnumMap;

public class OrderStats {

    public static void main(String[] args) {
        // 使用 EnumMap 统计订单状态
        EnumMap<OrderStatus, Integer> orderCountMap = new EnumMap<>(OrderStatus.class);
        
        // 假设有若干个订单
        orderCountMap.put(OrderStatus.PENDING, 100);
        orderCountMap.put(OrderStatus.SHIPPED, 200);
        orderCountMap.put(OrderStatus.DELIVERED, 150);
        orderCountMap.put(OrderStatus.CANCELLED, 50);
        
        // 打印统计结果
        for (Map.Entry<OrderStatus, Integer> entry : orderCountMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue() + " orders");
        }
    }
}

输出:

PENDING: 100 orders
SHIPPED: 200 orders
DELIVERED: 150 orders
CANCELLED: 50 orders

在这种情况下,EnumMap 由于直接使用数组存储数据,查询每个状态的订单数量比 HashMap 更加高效。而且,代码更加清晰,避免了哈希冲突的潜在问题。


5. 总结

  • 高效性能EnumMap 在枚举类型作为键时,提供了显著的性能提升,因为它底层使用数组索引访问元素,不涉及哈希计算,查询速度更快。
  • 强类型保证EnumMap 强制使用枚举类型作为键,避免了类型错误,提高了代码的类型安全性。
  • 内存效率:与 HashMap 相比,EnumMap 的内存占用更小,适合大量枚举值的存储。

使用 EnumMap 时,不仅能提高性能,还能使代码更加简洁和类型安全。在合适的场景下,EnumMap 是非常值得选择的工具。希望通过这个实际案例,你能更好地理解 EnumMap 的优势,并将它运用到实际的开发中!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

  • 随机文章
  • 热门文章
  • 热评文章
热门