使用EnumMap类实现基于枚举的键值对集合

EnumMap类是Java集合框架中提供的一种特殊的Map实现,它专门用于处理枚举类型作为键的情况。EnumMap类提供了高效的实现,它基于数组实现并与枚举类型的顺序相对应,因此在性能上具有优势。本文将详细介绍如何使用EnumMap类实现基于枚举的键值对集合,并提供相应的源代码示例。

首先,我们需要定义一个枚举类型作为键。以下是一个示例枚举类型:

enum Day {
   
   
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

接下来,我们可以使用EnumMap类来创建一个基于枚举的键值对集合,并进行相关操作。以下是一些常见操作的示例代码:

import java.util.EnumMap;

public class EnumMapExample {
   
   
    public static void main(String[] args) {
   
   
        // 创建一个EnumMap实例
        EnumMap<Day, String> enumMap = new EnumMap<>(Day.class);

        // 向EnumMap中添加键值对
        enumMap.put(Day.MONDAY, "星期一");
        enumMap.put(Day.TUESDAY, "星期二");
        enumMap.put(Day
<think>我们正在讨论Java枚举型的数据集合操作。根据引用,我们知道可以使用values()方法获取枚举集合。此外,EnumSet和EnumMap是专门为枚举设计的高效集合。下面将展示枚举集合的查询操作示例。 ### 1. **获取枚举所有值** 使用`values()`方法获取枚举的所有常量,返回一个数组。 ```java public enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; public static void main(String[] args) { // 获取所有枚举值 Weekday[] allDays = Weekday.values(); for (Weekday day : allDays) { System.out.println(day); } } } ``` 输出: ``` MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY ``` [^1] ### 2. **使用EnumSet创建子集** `EnumSet`提供高效的集合操作,特别适合枚举范围操作。 ```java import java.util.EnumSet; public class WeekdayExample { public static void main(String[] args) { // 创建工作日集合 (周一到周五) EnumSet<Weekday> workDays = EnumSet.range(Weekday.MONDAY, Weekday.FRIDAY); // 创建周末集合 (周六和周日) EnumSet<Weekday> weekend = EnumSet.of(Weekday.SATURDAY, Weekday.SUNDAY); // 判断今天是否是工作日 Weekday today = Weekday.WEDNESDAY; if (workDays.contains(today)) { System.out.println(today + " 是工作日"); } } } ``` 输出: `WEDNESDAY 是工作日` [^1] ### 3. **使用EnumMap存储关联数据** `EnumMap`是专门为枚举键设计的映射,性能优于`HashMap`。 ```java import java.util.EnumMap; public class WeekdaySchedule { public static void main(String[] args) { // 创建日程映射 EnumMap<Weekday, String> scheduleMap = new EnumMap<>(Weekday.class); scheduleMap.put(Weekday.MONDAY, "团队会议"); scheduleMap.put(Weekday.WEDNESDAY, "代码审查"); scheduleMap.put(Weekday.FRIDAY, "周总结会"); // 查询周三的日程 System.out.println("周三安排: " + scheduleMap.get(Weekday.WEDNESDAY)); // 遍历整个日程表 for (EnumMap.Entry<Weekday, String> entry : scheduleMap.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } ``` 输出: ``` 周三安排: 代码审查 MONDAY: 团队会议 WEDNESDAY: 代码审查 FRIDAY: 周总结会 ``` [^1] ### 4. **流式操作枚举集合** Java 8及以上可以使用Stream API处理枚举集合。 ```java import java.util.Arrays; import java.util.stream.Collectors; public class StreamEnumExample { public static void main(String[] args) { // 过滤出所有以"S"开头的枚举值 String sDays = Arrays.stream(Weekday.values()) .filter(day -> day.name().startsWith("S")) .map(Enum::name) .collect(Collectors.joining(", ")); System.out.println("周末: " + sDays); } } ``` 输出: `周末: SATURDAY, SUNDAY` [^1] ### 5. **根据属性查询枚举** 对于带属性的枚举,可以通过属性值查找枚举实例。 ```java public enum Planet { MERCURY(3.30e23, 2439.7), VENUS(4.87e24, 6051.8), EARTH(5.97e24, 6371.0); private final double mass; // 质量(kg) private final double radius; // 半径(km) Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } // 根据半径查找行星 public static Planet findByRadius(double radius) { for (Planet planet : values()) { if (planet.radius == radius) { return planet; } } return null; } } // 使用示例 public class PlanetSearch { public static void main(String[] args) { Planet earth = Planet.findByRadius(6371.0); System.out.println("半径6371.0的行星: " + earth); // 输出: EARTH } } ``` [^3] > **最佳实践总结**: > - 优先使用`EnumSet`和`EnumMap`处理枚举集合 > - 利用`values()`遍历枚举常量 > - 结合Stream API进行过滤和转换 > - 为带属性的枚举实现自定义查找方法 --- §§相关问题§§ 1. 枚举型如何与数据库进行映射存储? 2. 如何在枚举实现自定义的`toString()`和`valueOf()`方法? 3. 枚举型在Spring框架中如何实现依赖注入?</think>### Java 枚举型数据集合操作示例 #### 1. **获取枚举集合** 使用 `values()` 方法获取枚举的所有值: ```java enum Color { RED, GREEN, BLUE } public class Main { public static void main(String[] args) { // 获取枚举集合 Color[] colors = Color.values(); // 遍历输出 for (Color color : colors) { System.out.println(color); } } } ``` 输出: ``` RED GREEN BLUE ``` [^1] #### 2. **使用 EnumSet 高效操作** `EnumSet` 是专为枚举设计的高性能集合: ```java import java.util.EnumSet; public class Main { public static void main(String[] args) { // 创建包含所有枚举集合 EnumSet<Color> allColors = EnumSet.allOf(Color.class); // 创建范围集合 EnumSet<Color> warmColors = EnumSet.of(Color.RED, Color.GREEN); // 检查包含关系 System.out.println("包含红色吗? " + warmColors.contains(Color.RED)); // true } } ``` #### 3. **使用 EnumMap 键值映射** `EnumMap` 是专为枚举键设计的映射: ```java import java.util.EnumMap; public class Main { public static void main(String[] args) { // 创建枚举映射 EnumMap<Color, String> colorDescriptions = new EnumMap<>(Color.class); // 添加键值对 colorDescriptions.put(Color.RED, "热情的颜色"); colorDescriptions.put(Color.GREEN, "自然的颜色"); // 获取值 System.out.println(Color.RED + ": " + colorDescriptions.get(Color.RED)); // 遍历映射 colorDescriptions.forEach((color, desc) -> System.out.println(color + " -> " + desc)); } } ``` #### 4. **流式处理枚举集合** Java 8+ 流式操作: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 过滤枚举值 List<Color> primaryColors = Arrays.stream(Color.values()) .filter(c -> c != Color.GREEN) .collect(Collectors.toList()); // 转换为字符串集合 List<String> colorNames = Arrays.stream(Color.values()) .map(Enum::name) .collect(Collectors.toList()); System.out.println("原色: " + primaryColors); System.out.println("颜色名: " + colorNames); } } ``` #### 5. **带属性的枚举集合操作** ```java enum Planet { MERCURY(3.3e23, 2439.7), EARTH(5.97e24, 6371.0), MARS(6.4e23, 3389.5); private final double mass; // 质量(kg) private final double radius; // 半径(km) Planet(double mass, double radius) { this.mass = mass; this.radius = radius; } public double getMass() { return mass; } public double getRadius() { return radius; } } public class Main { public static void main(String[] args) { // 计算所有行星的平均质量 double avgMass = Arrays.stream(Planet.values()) .mapToDouble(Planet::getMass) .average() .orElse(0); System.out.println("平均质量: " + avgMass + " kg"); // 查找特定条件的行星 Planet largePlanet = Arrays.stream(Planet.values()) .filter(p -> p.getRadius() > 6000) .findFirst() .orElse(null); System.out.println("半径大于6000km的行星: " + largePlanet); } } ``` #### 6. **集合转换方法** ```java public class EnumUtils { // 枚举集合转字符串 public static String enumToString(Enum<?>[] enums) { return Arrays.stream(enums) .map(Enum::name) .collect(Collectors.joining(", ")); } // 字符串转枚举集合 public static List<Color> stringToColorList(String input) { return Arrays.stream(input.split(",")) .map(String::trim) .map(Color::valueOf) .collect(Collectors.toList()); } } // 使用示例 List<Color> colors = EnumUtils.stringToColorList("RED, GREEN, BLUE"); String colorString = EnumUtils.enumToString(Color.values()); ``` > **最佳实践**: > 1. 优先使用 `EnumSet` 和 `EnumMap` 替代普通集合 > 2. 使用流式操作处理枚举集合 > 3. 为带属性的枚举实现自定义查询方法 > 4. 避免使用 `ordinal()` 进行索引操作(易受枚举顺序变化影响) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值