最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?Multimap實現(xiàn)類與操作的具體示例

 更新時間:2025年06月09日 11:17:24   作者:A-angular  
Multimap出現(xiàn)在Google的Guava庫中,它為Java提供了更加靈活的集合操作,這篇文章主要介紹了Java?Multimap實現(xiàn)類與操作的具體示例,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、Multimap 概述

Multimap 是 Google Guava 庫中提供的一種集合類型,它擴展了傳統(tǒng)的 Map 概念,允許一個鍵對應(yīng)多個值。與標準的 Map<K, List<V>> 或 Map<K, Set<V>> 相比,Multimap 提供了更簡潔的 API 和更強大的功能。

Multimap 主要特點:

  • 一個鍵可以映射到多個值
  • 避免了手動管理值集合的麻煩
  • 提供了豐富的視圖集合
  • 支持不可變實現(xiàn)

二、Multimap 實現(xiàn)類

Guava 提供了多種 Multimap 實現(xiàn),每種實現(xiàn)都有不同的特性和使用場景。

1. ListMultimap 系列

特點:值以 List 形式存儲,允許重復(fù)值,保留插入順序

實現(xiàn)類描述是否線程安全
ArrayListMultimap使用 ArrayList 作為值集合
LinkedListMultimap使用 LinkedList 作為值集合
ImmutableListMultimap不可變實現(xiàn)

2. SetMultimap 系列

特點:值以 Set 形式存儲,不允許重復(fù)值

實現(xiàn)類描述是否線程安全
HashMultimap使用 HashSet 作為值集合
LinkedHashMultimap使用 LinkedHashSet 作為值集合,保留插入順序
TreeMultimap使用 TreeSet 作為值集合,按鍵和值排序
ImmutableSetMultimap不可變實現(xiàn)

3. 其他實現(xiàn)

實現(xiàn)類描述是否線程安全
Multimaps.synchronizedMultimap同步包裝器,使任何 Multimap 線程安全
Multimaps.unmodifiableMultimap不可修改視圖

三、Multimap 基本操作示例

1. 創(chuàng)建 Multimap

// 創(chuàng)建ArrayListMultimap
ListMultimap<String, String> listMultimap = ArrayListMultimap.create();

// 創(chuàng)建HashMultimap
SetMultimap<String, Integer> setMultimap = HashMultimap.create();

// 創(chuàng)建不可變Multimap
ImmutableListMultimap<String, String> immutableMultimap = ImmutableListMultimap.of(
    "key1", "value1",
    "key1", "value2",
    "key2", "value3"
);

2. 添加元素

ListMultimap<String, String> multimap = ArrayListMultimap.create();

// 添加單個元素
multimap.put("fruit", "apple");
multimap.put("fruit", "banana");
multimap.put("fruit", "orange");
multimap.put("vegetable", "carrot");

// 添加多個元素
multimap.putAll("fruit", Arrays.asList("pear", "grape"));
multimap.putAll("vegetable", Arrays.asList("potato", "tomato"));

3. 獲取元素

// 獲取某個鍵的所有值
List<String> fruits = multimap.get("fruit"); // [apple, banana, orange, pear, grape]

// 獲取第一個值
String firstFruit = multimap.get("fruit").get(0); // apple

// 檢查鍵是否存在
boolean hasFruit = multimap.containsKey("fruit"); // true

// 檢查鍵值對是否存在
boolean hasApple = multimap.containsEntry("fruit", "apple"); // true

4. 刪除元素

// 刪除鍵的所有值
multimap.removeAll("fruit"); // 返回被刪除的值列表

// 刪除特定鍵值對
multimap.remove("vegetable", "tomato"); // 返回boolean表示是否刪除成功

// 清空所有元素
multimap.clear();

5. 視圖操作

// 獲取所有鍵的集合(去重)
Set<String> keys = multimap.keySet();

// 獲取所有值的集合(不去重)
Collection<String> values = multimap.values();

// 獲取鍵值對集合
Collection<Map.Entry<String, String>> entries = multimap.entries();

// 將Multimap轉(zhuǎn)換為Map<K, Collection<V>>
Map<String, Collection<String>> mapView = multimap.asMap();

四、不同實現(xiàn)類的具體示例

1. ArrayListMultimap 示例

// 創(chuàng)建ArrayListMultimap
ListMultimap<String, Integer> scores = ArrayListMultimap.create();

// 添加元素
scores.put("Alice", 90);
scores.put("Alice", 85);
scores.put("Bob", 75);
scores.put("Bob", 80);
scores.put("Bob", 82);

// 獲取元素
List<Integer> aliceScores = scores.get("Alice"); // [90, 85]
List<Integer> bobScores = scores.get("Bob"); // [75, 80, 82]

// 允許重復(fù)值
scores.put("Alice", 90);
List<Integer> newAliceScores = scores.get("Alice"); // [90, 85, 90]

2. HashMultimap 示例

// 創(chuàng)建HashMultimap
SetMultimap<String, String> tags = HashMultimap.create();

// 添加元素
tags.put("article1", "tech");
tags.put("article1", "java");
tags.put("article1", "programming");
tags.put("article2", "design");
tags.put("article2", "ui");

// 嘗試添加重復(fù)值
tags.put("article1", "java"); // 不會有任何效果

// 獲取元素
Set<String> article1Tags = tags.get("article1"); // [tech, java, programming]
Set<String> article2Tags = tags.get("article2"); // [design, ui]

3. TreeMultimap 示例

// 創(chuàng)建TreeMultimap(按鍵和值排序)
TreeMultimap<String, Integer> sortedScores = TreeMultimap.create();

// 添加元素(亂序)
sortedScores.put("Bob", 80);
sortedScores.put("Alice", 90);
sortedScores.put("Bob", 75);
sortedScores.put("Alice", 85);

// 獲取元素(自動排序)
SortedSet<Integer> aliceSortedScores = sortedScores.get("Alice"); // [85, 90]
SortedSet<Integer> bobSortedScores = sortedScores.get("Bob"); // [75, 80]

// 整個Multimap也是按鍵排序的
System.out.println(sortedScores); // {Alice=[85, 90], Bob=[75, 80]}

4. ImmutableListMultimap 示例

// 創(chuàng)建不可變Multimap
ImmutableListMultimap<String, String> immutableMap = ImmutableListMultimap.<String, String>builder()
    .put("colors", "red")
    .put("colors", "green")
    .put("colors", "blue")
    .put("shapes", "circle")
    .put("shapes", "square")
    .build();

// 嘗試修改會拋出UnsupportedOperationException
// immutableMap.put("colors", "yellow"); // 錯誤!

// 安全地獲取數(shù)據(jù)
List<String> colors = immutableMap.get("colors"); // [red, green, blue]

五、高級操作與工具方法

1. 使用 Multimaps 工具類

// 從Map<K, Collection<V>>創(chuàng)建Multimap
Map<String, List<Integer>> map = new HashMap<>();
map.put("a", Arrays.asList(1, 2, 3));
map.put("b", Arrays.asList(4, 5));
ListMultimap<String, Integer> multimap = Multimaps.forMap(map);

// 轉(zhuǎn)換Multimap的值類型
ListMultimap<String, String> stringMultimap = ArrayListMultimap.create();
stringMultimap.put("key", "1");
stringMultimap.put("key", "2");
ListMultimap<String, Integer> intMultimap = Multimaps.transformValues(stringMultimap, Integer::valueOf);

// 反轉(zhuǎn)Multimap(鍵值互換)
SetMultimap<Integer, String> inverted = Multimaps.invertFrom(stringMultimap, HashMultimap.create());

2. 過濾操作

ListMultimap<String, Integer> scores = ArrayListMultimap.create();
scores.put("Alice", 90);
scores.put("Alice", 85);
scores.put("Bob", 75);
scores.put("Bob", 80);

// 過濾出分數(shù)大于80的條目
Multimap<String, Integer> highScores = Multimaps.filterEntries(scores, 
    entry -> entry.getValue() > 80);

System.out.println(highScores); // {Alice=[90, 85]}

3. 同步包裝

ListMultimap<String, String> unsafeMultimap = ArrayListMultimap.create();

// 創(chuàng)建線程安全版本
ListMultimap<String, String> safeMultimap = Multimaps.synchronizedListMultimap(unsafeMultimap);

// 現(xiàn)在可以安全地在多線程環(huán)境中使用
safeMultimap.put("key", "value");

六、性能比較與選擇指南

實現(xiàn)類鍵存儲值存儲允許重復(fù)值順序保證典型用途
ArrayListMultimapHashMapArrayList插入順序需要保留插入順序且允許重復(fù)值的場景
LinkedListMultimapLinkedHashMapLinkedList插入順序需要頻繁在中間插入/刪除的場景
HashMultimapHashMapHashSet需要快速查找且不需要重復(fù)值的場景
LinkedHashMultimapLinkedHashMapLinkedHashSet插入順序需要保留插入順序且不允許重復(fù)值的場景
TreeMultimapTreeMapTreeSet排序順序需要按鍵和值排序的場景
ImmutableListMultimap不可變不可變構(gòu)造順序需要不可變集合的場景
ImmutableSetMultimap不可變不可變構(gòu)造順序需要不可變集合且不允許重復(fù)值的場景

選擇建議

  • 如果需要允許重復(fù)值 - 選擇 ListMultimap 實現(xiàn)
  • 如果需要快速查找且不允許重復(fù)值 - 選擇 SetMultimap 實現(xiàn)
  • 如果需要排序功能 - 選擇 TreeMultimap
  • 如果需要線程安全 - 使用不可變實現(xiàn)或同步包裝器
  • 如果數(shù)據(jù)不常變化 - 優(yōu)先考慮不可變實現(xiàn)

七、常見問題解答

Q1: Multimap 和 Map<K, List> 有什么區(qū)別?

A1: 主要區(qū)別在于:

  • Multimap 提供了更簡潔的 API,不需要手動管理值集合
  • Multimap 提供了豐富的視圖方法(如 entries(), keys(), values())
  • Multimap 隱藏了實現(xiàn)細節(jié),可以更靈活地切換底層實現(xiàn)
  • Multimap 的方法更直觀,如 put() 直接添加元素而不需要先檢查是否存在集合

Q2: 如何將 Multimap 轉(zhuǎn)換為傳統(tǒng)的 Map?

A2: 可以使用 asMap() 方法:

ListMultimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("key", "value1");
multimap.put("key", "value2");

Map<String, Collection<String>> map = multimap.asMap();

Q3: Multimap 是線程安全的嗎?

A3: 大多數(shù) Multimap 實現(xiàn)不是線程安全的,除了:

  • 不可變實現(xiàn)(ImmutableListMultimap, ImmutableSetMultimap)
  • 使用 Multimaps.synchronizedMultimap() 包裝的 Multimap

Q4: 如何統(tǒng)計 Multimap 中每個鍵對應(yīng)的值數(shù)量?

A4: 可以使用 Multimap 的 keys() 方法結(jié)合 Multisets:

ListMultimap<String, String> multimap = ArrayListMultimap.create();
// 添加元素...

Multiset<String> counts = HashMultiset.create(multimap.keys());
System.out.println(counts); // 顯示每個鍵的出現(xiàn)次數(shù)

八、總結(jié)

Guava 的 Multimap 提供了一種優(yōu)雅的方式來處理鍵到多個值的映射關(guān)系,比傳統(tǒng)的 Map<K, Collection<V>> 更加方便和強大。通過選擇合適的實現(xiàn)類,可以滿足各種不同的業(yè)務(wù)需求,包括是否需要允許重復(fù)值、是否需要保持順序、是否需要排序等功能。

在實際開發(fā)中,Multimap 特別適用于以下場景:

  • 標簽系統(tǒng)(一個項目有多個標簽)
  • 學(xué)生成績記錄(一個學(xué)生有多門成績)
  • 反向索引(一個單詞出現(xiàn)在多個文檔中)
  • 分組統(tǒng)計(按類別分組記錄)

掌握 Multimap 的使用可以顯著簡化代碼,提高開發(fā)效率,是 Java 開發(fā)者工具箱中不可或缺的工具之一。

到此這篇關(guān)于Java Multimap實現(xiàn)類與操作具體示例的文章就介紹到這了,更多相關(guān)Java Multimap類操作示例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java語言打印九九乘法表

    Java語言打印九九乘法表

    這篇文章主要為大家詳細介紹了Java語言打印九九乘法表的相關(guān)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • idea啟動項目提示端口占用的問題解決

    idea啟動項目提示端口占用的問題解決

    有時候當我們使用Tomcat啟動web項目時,會提示端口占用,導(dǎo)致啟動失敗,本文就來介紹一下端口占用的解決方法,具有一定的參考價值,感興趣的可以了解下
    2023-08-08
  • SSH 框架簡介

    SSH 框架簡介

    SSH是 struts+spring+hibernate的一個集成框架,是目前較流行的一種web應(yīng)用程序開源框架。本文給大家詳細看一下組成SSH的這三個框架
    2017-09-09
  • java中Scanner輸入用法實例

    java中Scanner輸入用法實例

    Java的Scanner用法,主要用于算法筆試時的控制臺輸入,下面這篇文章主要給大家介紹了關(guān)于java中Scanner輸入用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Java從List中刪除元素的幾種方式小結(jié)

    Java從List中刪除元素的幾種方式小結(jié)

    在Java中,List 接口提供了一個 remove(Object o) 方法來移除列表中與給定對象相等的第一個元素,然而,直接使用這個方法來刪除列表中的元素有時并不是最優(yōu)的選擇,主要原因包括效率和同步性問題,本文介紹了Java從List中刪除元素的幾種方式,需要的朋友可以參考下
    2024-08-08
  • Idea的Generate Sources無法生成QueryDSL問題及解決方法

    Idea的Generate Sources無法生成QueryDSL問題及解決方法

    這篇文章主要介紹了解決Idea的Generate Sources無法生成QueryDSL問題,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Springcloud Config支持本地配置文件的方法示例

    Springcloud Config支持本地配置文件的方法示例

    這篇文章主要介紹了Springcloud Config支持本地配置文件的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 解決rror updating database.Cause:java.sql.SQLSyntaxErrorException問題

    解決rror updating database.Cause:java.sql.SQLSyntaxE

    這篇文章主要介紹了解決rror updating database.Cause:java.sql.SQLSyntaxErrorException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 基于springMvc+hibernate的web application的構(gòu)建

    基于springMvc+hibernate的web application的構(gòu)建

    下面小編就為大家?guī)硪黄趕pringMvc+hibernate的web application的構(gòu)建。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • JDK8 中線程實現(xiàn)方法與底層邏輯深度解析

    JDK8 中線程實現(xiàn)方法與底層邏輯深度解析

    JDK8提供了多種線程實現(xiàn)方式,包括繼承Thread類、實現(xiàn)Runnable接口和Callable接口,還介紹了線程池的實現(xiàn)和JDK8新增特性CompletableFuture,底層線程模型包括JVM線程與操作系統(tǒng)線程的關(guān)系、線程狀態(tài)轉(zhuǎn)換以及創(chuàng)建與銷毀的開銷,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評論

绥德县| 邮箱| 洛川县| 高要市| 逊克县| 兴宁市| 大同县| 图们市| 大宁县| 抚宁县| 双柏县| 遵义县| 临颍县| 平原县| 新龙县| 长汀县| 永胜县| 西贡区| 邓州市| 盐津县| 江华| 丹东市| 大埔县| 沧源| 城步| 二手房| 叶城县| 陈巴尔虎旗| 乐东| 望江县| 东阳市| 旺苍县| 新沂市| 祥云县| 长岛县| 故城县| 潮州市| 安平县| 馆陶县| 望都县| 闽侯县|