一、什麼是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-tw/n/192309.html