Java Multimap詳解

一、什麼是Java Multimap

Java Multimap是Google Guava提供的一個數據結構,它可以保存一個key對應多個value的映射關係,可以理解為Map<K, Collection>的一個實現,其中K為鍵類型,V為值類型。

使用Java Multimap可以方便地保存鍵值對的映射關係,而不必自己維護複雜的數據結構。它可以用於諸如多重映射、索引、結果集、緩存等場景。

    Multimap multimap = ArrayListMultimap.create();
    multimap.put("key1", 1);
    multimap.put("key2", 2);
    multimap.put("key1", 3);
    Collection values = multimap.get("key1");
    System.out.println(values); // [1, 3]

二、Java Multimap的實現

Java Multimap提供了多個實現類,包括ArrayListMultimap、HashMultimap、LinkedListMultimap、LinkedHashMultimap和TreeMultimap,它們的實現方式不同,在不同的場景下選擇不同的實現類可以提高性能。

其中ArrayListMultimap和HashMultimap是最常用的實現類。ArrayListMultimap通過HashMap保存鍵值對,使用ArrayList保存相同key對應的value,它的put操作是O(1)複雜度;HashMultimap同樣通過HashMap保存鍵值對,但是使用HashSet保存相同key對應的value,put操作的複雜度也是O(1)。

    // ArrayListMultimap的創建
    Multimap arrayListMultimap = ArrayListMultimap.create();
    // HashMultimap的創建
    Multimap hashMultimap = HashMultimap.create();

三、Java Multimap的API們

1、put和putAll

put方法向Multimap中添加單個鍵值對,而putAll方法同時向Multimap中添加多個鍵值對。

    Multimap multimap = ArrayListMultimap.create();
    multimap.put("key", 1);
    multimap.putAll("key", Arrays.asList(2, 3, 4));
    System.out.println(multimap.get("key")); // [1, 2, 3, 4]

2、get、keys和values

get方法可以獲取某個key對應的所有值,keys方法可以獲取所有不同的key,values方法可以獲取所有的值。

    Multimap multimap = ArrayListMultimap.create();
    multimap.putAll("key", Arrays.asList(1, 2, 3, 4));
    Collection values = multimap.get("key");
    Collection keys = multimap.keys();
    Collection allValues = multimap.values();
    System.out.println(values); // [1, 2, 3, 4]
    System.out.println(keys); // [key]
    System.out.println(allValues); // [1, 2, 3, 4]

3、entries、remove和removeAll

entries方法返回所有鍵值對的集合,remove方法可以移除單個鍵值對,removeAll方法可以移除所有指定key對應的鍵值對。

    Multimap multimap = ArrayListMultimap.create();
    multimap.putAll("key", Arrays.asList(1, 2, 3, 4));
    Collection<Map.Entry> entries = multimap.entries();
    System.out.println(entries); // [key=1, key=2, key=3, key=4]
    multimap.remove("key", 1);
    System.out.println(multimap.get("key")); // [2, 3, 4]
    multimap.removeAll("key");
    System.out.println(multimap.get("key")); // []

四、Java Multimap的應用

1、多重映射

Java Multimap最常用的應用就是多重映射,可以通過一個key來關聯多個value。

    Multimap multimap = ArrayListMultimap.create();
    multimap.putAll("key1", Arrays.asList(1, 2, 3, 4));
    multimap.putAll("key2", Arrays.asList(5, 6, 7, 8));
    System.out.println(multimap.get("key1")); // [1, 2, 3, 4]
    System.out.println(multimap.get("key2")); // [5, 6, 7, 8]

2、索引

Java Multimap可以用作索引,將某個值與多個元素關聯起來。

    Multimap multimap = ArrayListMultimap.create();
    multimap.put(1, "apple");
    multimap.put(2, "banana");
    multimap.put(3, "orange");
    multimap.put(1, "peach");
    Collection values = multimap.get(1);
    System.out.println(values); // [apple, peach]
    for (Map.Entry entry : multimap.entries()) {
        System.out.println(entry.getKey() + " : " + entry.getValue());
    }
    /*
    1 : apple
    1 : peach
    2 : banana
    3 : orange
    */

3、結果集

在查詢數據庫時,有時需要返回具有相同屬性的一組對象,Java Multimap可以用來創建結果集。

    class Person {
        String name;
        int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    Multimap multimap = ArrayListMultimap.create();
    multimap.put("man", new Person("Tom", 30));
    multimap.put("woman", new Person("Lucy", 25));
    multimap.put("man", new Person("Jack", 35));
    Collection values = multimap.get("man");
    for (Person person : values) {
        System.out.println(person.name + " : " + person.age);
    }
    /*
    Tom : 30
    Jack : 35
    */

4、緩存

Java Multimap可以用來實現緩存,將多個value保存到同一個key下,遇到並發問題時,可以方便地控制和處理。

    LoadingCache<String, Collection> cache = CacheBuilder.newBuilder().build(
            new CacheLoader<String, Collection>() {
                public Collection load(String key) throws Exception {
                    return Arrays.asList(key + "_value1", key + "_value2");
                }
            }
    );
    Collection values = cache.get("key");
    System.out.println(values); // [key_value1, key_value2]

五、小結

Java Multimap是一個非常實用的數據結構,可以方便地處理多個value和同一個key的映射關係。在實際開發中,可以根據具體的場景選擇不同的實現類,提高讀寫性能。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/192309.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 09:57
下一篇 2024-12-01 09:57

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論