2026/8/24

Java Multimap

一般基本的 Map 是唯一的 Key,搭配一個 Value 的資料結構,實務上,有時候會遇到,一個 Key,搭配對應的 Value,在 Value 是有多種可能的,例如在公司部門分類下,每個部門都有各自的員工。

這種資料結構,用標準 JDK 提供的 Map 搭配 ArrayList 就可以完成,但還有其他幾個封裝比較好的函式庫,有提供這種資料結構的類別實作。

  • Apache Commons Collecitons 的 MultiValuedMap

  • Guava 的 Multimap

  • Spring Framework 的 MultiValueMap

如果要測試這幾種實作方式,要先引用函式庫

    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>33.5.0-jre</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>7.0.6</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.5.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

Java 實例

import com.google.common.collect.Multimap;
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

import java.util.*;

public class ArrayListMultimap {
    public void main(String[] args) {
        ArrayListMultimap.jdk();
        ArrayListMultimap.apacheCommons();
        ArrayListMultimap.guava();
        ArrayListMultimap.spring();
    }

    public static void addEmployee(Map<String, List<String>> map, String department, String employee) {

        if (!map.containsKey(department)) {
            map.put(department, new ArrayList<>());
        }

        map.get(department).add(employee);
    }

    public static void jdk() {

        Map<String, List<String>> departmentEmployees = new HashMap<>();

        addEmployee(departmentEmployees, "RD", "Thomas");
        addEmployee(departmentEmployees, "RD", "James");
        addEmployee(departmentEmployees, "MA", "Emma");
        addEmployee(departmentEmployees, "MA", "Dave");
        addEmployee(departmentEmployees, "HR", "Carol");

        System.out.println("=== JDK HashMap + List<String> ===");
        System.out.println(departmentEmployees);
    }
    public static void apacheCommons() {
        MultiValuedMap<String, String> departmentEmployees = new ArrayListValuedHashMap<>();

        departmentEmployees.put("RD", "Thomas");
        departmentEmployees.put("RD", "James");
        departmentEmployees.put("MA", "Emma");
        departmentEmployees.put("MA", "Dave");
        departmentEmployees.put("HR", "Carol");

        System.out.println("=== Apache Commons ArrayListValuedHashMap ===");
        System.out.println(departmentEmployees);
    }
    public static void guava() {
        List<String> rdlist = Arrays.asList("Thomas", "James");
        List<String> malist = Arrays.asList("Emma", "Dave");
        List<String> hrlist = Arrays.asList("Carol");

        Multimap<String, List<String>> listMultimap = com.google.common.collect.ArrayListMultimap.create();
        listMultimap.put("RD", rdlist);
        listMultimap.put("MA", malist);
        listMultimap.put("HR", hrlist);

        System.out.println("=== guava ArrayListMultimap ===");
        System.out.println(listMultimap);
    }

    public static void spring() {

        MultiValueMap<String, String> departmentEmployees = new LinkedMultiValueMap<>();

        departmentEmployees.add("RD", "Thomas");
        departmentEmployees.add("RD", "James");
        departmentEmployees.add("MA", "Emma");
        departmentEmployees.add("MA", "Dave");
        departmentEmployees.add("HR", "Carol");

        System.out.println("=== Spring LinkedMultiValueMap ===");
        System.out.println(departmentEmployees);
    }
}

執行結果

=== JDK HashMap + List<String> ===
{RD=[Thomas, James], MA=[Emma, Dave], HR=[Carol]}
=== Apache Commons ArrayListValuedHashMap ===
{RD=[Thomas, James], MA=[Emma, Dave], HR=[Carol]}
=== guava ArrayListMultimap ===
{RD=[[Thomas, James]], MA=[[Emma, Dave]], HR=[[Carol]]}
=== Spring LinkedMultiValueMap ===
{RD=[Thomas, James], MA=[Emma, Dave], HR=[Carol]}

沒有留言:

張貼留言