在Java中,java.util包中存在Map接口,表示鍵和值之間的映射。 Java Map 接口不是 Collection interface 的子類型。因此,它的行為與其他集合類型有點不同。映射包含唯一的鍵。
極客們,集思廣益應該討論為什麽以及何時使用Map。
映射非常適合用於鍵值關聯映射,例如字典。這些映射用於通過鍵執行查找,或者當有人想要通過鍵檢索和更新元素時。一些常見的場景如下:
- 錯誤代碼及其說明的映射。
- 郵政編碼和城市的Map。
- 經理和員工的Map。每個經理(鍵)都與其管理的員工(值)列表相關聯。
- 類和學生的Map。每個類(鍵)都與一個學生列表(值)相關聯。
創建Map對象
由於 Map 是 interface ,因此無法創建 Map 類型的對象。我們總是需要一個擴展這個映射的類來創建一個對象。而且,在Java 1.5中引入Generics之後,可以限製Map中可以存儲的對象類型。
用法:定義類型安全映射
Map hm = new HashMap(); // Obj is the type of the object to be stored in Map
Map接口的特點
- Map 不能包含重複的鍵,並且每個鍵最多可以映射到一個值。某些實現允許空鍵和空值,例如 HashMap 和 LinkedHashMap ,但有些實現不喜歡 TreeMap 。
- 映射的順序取決於具體的實現。例如,TreeMap 和 LinkedHashMap 具有可預測的順序,而 HashMap 則沒有。
- Java 中有兩個實現 Map 的接口。它們是 Map 和 SortedMap ,以及三個類:HashMap、TreeMap 和 LinkedHashMap。
Java Map 接口中的方法
方法 | 執行的操作 |
---|---|
Map clear() | 此方法在 Java Map Interface 中用於清除和刪除指定 Map 集合中的所有元素或映射。 |
Map containsKey() | Java 中的 Map 接口使用此方法來檢查特定鍵是否已映射到 Map 中。它將關鍵元素作為參數,如果該元素已映射到映射中,則返回 True。 |
Map containsValue() | Map 接口中使用此方法來檢查特定值是否由 Map 中的單個或多個鍵映射。它將該值作為參數,如果該值由映射中的任何鍵映射,則返回 True。 |
Map entrySet() | Java 的Map接口中使用此方法來創建Map中包含的相同元素的集合。它本質上返回Map的集合視圖,或者我們可以創建一個新集合並將Map元素存儲到其中。 |
Map equals() | Java Map Interface 中使用此方法來檢查兩個映射之間的相等性。它驗證作為參數傳遞的一個映射的元素是否等於該映射的元素。 |
Map get() | 此方法用於檢索或獲取參數中提到的特定鍵映射的值。當映射不包含鍵的此類映射時,它返回 NULL。 |
Map hashCode() | 該方法在 Map 接口中用於為包含鍵和值的給定映射生成 hashCode。 |
Map isEmpty() | 此方法用於檢查映射是否有任何鍵和值對的條目。如果不存在映射,則返回 true。 |
Map keySet() | 此方法在 Map Interface 中用於返回此映射中包含的鍵的 Set 視圖。該集合由Map支持,因此對Map的更改會反映在集合中,反之亦然。 |
Map put() | Java Map Interface 中使用此方法將指定值與此映射中的指定鍵關聯起來。 |
Map putAll() | Java 中的 Map 接口使用此方法將指定映射中的所有映射複製到此映射。 |
Map remove() | 此方法在映射接口中用於從該映射中刪除鍵的映射(如果該鍵存在於映射中)。 |
HashMap size() | 此方法用於返回映射中可用的鍵/值對的數量。 |
HashMap values() | Java Map接口中使用此方法來創建Map值的集合。它本質上返回 HashMap 中值的集合視圖。 |
HashMap getOrDefault(key, defaultValue) | 返回指定鍵映射到的值,如果此映射不包含該鍵的映射,則返回 defaultValue。 |
HashMap merge(key, value, BiFunction) | 如果指定的鍵尚未與值關聯或與 null 關聯,則將其與給定的非 null 值關聯。 |
HashMap putIfAbsent(key, value) | 如果指定的鍵尚未與值關聯(或映射為 null),則將其與給定值關聯並返回 null,否則返回當前關聯值。 |
例子:
Java
// Java Program to Demonstrate
// Working of Map interface
// Importing required classes
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating an empty HashMap
Map<String, Integer> hm
= new HashMap<String, Integer>();
// Inserting pairs in above Map
// using put() method
hm.put("a", new Integer(100));
hm.put("b", new Integer(200));
hm.put("c", new Integer(300));
hm.put("d", new Integer(400));
// Traversing through Map using for-each loop
for (Map.Entry<String, Integer> me :
hm.entrySet()) {
// Printing keys
System.out.print(me.getKey() + ":");
System.out.println(me.getValue());
}
}
}
a:100 b:200 c:300 d:400
實現Map接口的類在下麵的媒體中說明,稍後說明如下:
1. 哈希映射
HashMap 是 Java 1.2 以來 Java 集合的一部分。它提供了Java Map接口的基本實現。它將數據存儲在(鍵,值)對中。要訪問一個值,必須知道它的鍵。此類使用名為 Hashing 的技術。散列是一種將大字符串轉換為表示相同字符串的小字符串的技術。較短的值有助於索引和更快的搜索。讓我們看看如何使用此類創建Map對象。
示例
Java
// Java Program to illustrate the Hashmap Class
// Importing required classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an empty HashMap
Map<String, Integer> map = new HashMap<>();
// Inserting entries in the Map
// using put() method
map.put("vishal", 10);
map.put("sachin", 30);
map.put("vaibhav", 20);
// Iterating over Map
for (Map.Entry<String, Integer> e : map.entrySet())
// Printing key-value pairs
System.out.println(e.getKey() + " "
+ e.getValue());
}
}
vaibhav 20 vishal 10 sachin 30
2.LinkedHashMap
LinkedHashMap 就像HashMap 一樣,具有維護插入其中的元素順序的附加函數。 HashMap 提供了快速插入、搜索和刪除的優點,但它從未保持 LinkedHashMap 提供的插入軌道和順序,其中可以按插入順序訪問元素。讓我們看看如何使用此類創建Map對象。
示例
Java
// Java Program to Illustrate the LinkedHashmap Class
// Importing required classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an empty LinkedHashMap
Map<String, Integer> map = new LinkedHashMap<>();
// Inserting pair entries in above Map
// using put() method
map.put("vishal", 10);
map.put("sachin", 30);
map.put("vaibhav", 20);
// Iterating over Map
for (Map.Entry<String, Integer> e : map.entrySet())
// Printing key-value pairs
System.out.println(e.getKey() + " "
+ e.getValue());
}
}
vishal 10 sachin 30 vaibhav 20
3.TreeMap
TreeMap in Java 用於實現 Map 接口,NavigableMap 以及抽象類。映射根據其鍵的自然順序進行排序,或者通過映射創建時提供的比較器進行排序,具體取決於使用的構造函數。事實證明,這是一種排序和存儲鍵值對的有效方法。樹形圖維護的存儲順序必須與 equals 一致,就像任何其他排序的映射一樣,無論顯式比較器如何。讓我們看看如何使用此類創建Map對象。
示例
Java
// Java Program to Illustrate TreeMap Class
// Importing required classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an empty TreeMap
Map<String, Integer> map = new TreeMap<>();
// Inserting custom elements in the Map
// using put() method
map.put("vishal", 10);
map.put("sachin", 30);
map.put("vaibhav", 20);
// Iterating over Map using for each loop
for (Map.Entry<String, Integer> e : map.entrySet())
// Printing key-value pairs
System.out.println(e.getKey() + " "
+ e.getValue());
}
}
sachin 30 vaibhav 20 vishal 10
使用執行操作Map接口和HashMap 類
由於 Map 是一個接口,因此它隻能與實現該接口的類一起使用。現在,讓我們看看如何使用廣泛使用的 HashMap class 在 Map 上執行一些常用操作。而且,在Java 1.5中引入Generics之後,可以限製可以存儲在映射中的對象的類型。
1. 添加元素
為了向Map添加元素,我們可以使用put() method。但是,插入順序不會保留在哈希圖中。在內部,對於每個元素,都會生成一個單獨的哈希值,並根據該哈希值對元素進行索引,以提高效率。
示例
Java
// Java program to demonstrate
// the working of Map interface
import java.util.*;
class GFG {
public static void main(String args[])
{
// Default Initialization of a
// Map
Map<Integer, String> hm1 = new HashMap<>();
// Initialization of a Map
// using Generics
Map<Integer, String> hm2
= new HashMap<Integer, String>();
// Inserting the Elements
hm1.put(1, "Geeks");
hm1.put(2, "For");
hm1.put(3, "Geeks");
hm2.put(new Integer(1), "Geeks");
hm2.put(new Integer(2), "For");
hm2.put(new Integer(3), "Geeks");
System.out.println(hm1);
System.out.println(hm2);
}
}
{1=Geeks, 2=For, 3=Geeks} {1=Geeks, 2=For, 3=Geeks}
2. 改變元素
添加元素後,如果我們想更改元素,可以通過再次添加帶有 put() method. 的元素來完成。由於映射中的元素是使用鍵進行索引的,因此隻需插入即可更改鍵的值我們希望更改的鍵的更新值。
示例
Java
// Java program to demonstrate
// the working of Map interface
import java.util.*;
class GFG {
public static void main(String args[])
{
// Initialization of a Map
// using Generics
Map<Integer, String> hm1
= new HashMap<Integer, String>();
// Inserting the Elements
hm1.put(new Integer(1), "Geeks");
hm1.put(new Integer(2), "Geeks");
hm1.put(new Integer(3), "Geeks");
System.out.println("Initial Map " + hm1);
hm1.put(new Integer(2), "For");
System.out.println("Updated Map " + hm1);
}
}
Initial Map {1=Geeks, 2=Geeks, 3=Geeks} Updated Map {1=Geeks, 2=For, 3=Geeks}
3. 刪除元素
為了從 Map 中刪除元素,我們可以使用 remove() method 。此方法獲取鍵值,並從該映射中刪除鍵的映射(如果該鍵存在於映射中)。
示例
Java
// Java program to demonstrate
// the working of Map interface
import java.util.*;
class GFG {
public static void main(String args[])
{
// Initialization of a Map
// using Generics
Map<Integer, String> hm1
= new HashMap<Integer, String>();
// Inserting the Elements
hm1.put(new Integer(1), "Geeks");
hm1.put(new Integer(2), "For");
hm1.put(new Integer(3), "Geeks");
hm1.put(new Integer(4), "For");
// Initial Map
System.out.println(hm1);
hm1.remove(new Integer(4));
// Final Map
System.out.println(hm1);
}
}
{1=Geeks, 2=For, 3=Geeks, 4=For} {1=Geeks, 2=For, 3=Geeks}
4. 迭代Map
有多種方法可以迭代 Map。最著名的方法是使用 for-each 循環並獲取 key 。使用getValue()方法找到鍵的值。
示例
Java
// Java program to demonstrate
// the working of Map interface
import java.util.*;
class GFG {
public static void main(String args[])
{
// Initialization of a Map
// using Generics
Map<Integer, String> hm1
= new HashMap<Integer, String>();
// Inserting the Elements
hm1.put(new Integer(1), "Geeks");
hm1.put(new Integer(2), "For");
hm1.put(new Integer(3), "Geeks");
for (Map.Entry mapElement : hm1.entrySet()) {
int key = (int)mapElement.getKey();
// Finding the value
String value = (String)mapElement.getValue();
System.out.println(key + " : " + value);
}
}
}
1 : Geeks 2 : For 3 : Geeks
5.使用Hashmap統計數字出現的次數
在此代碼中,我們使用 putIfAbsent() 和 Collections.frequency() 來計算數字的確切出現次數。在許多程序中,您需要計算特定數字或字母的出現次數。您可以使用以下方法來解決這些類型的問題
Java
// Java program to Count the Occurrence
// of numbers using Hashmap
import java.util.*;
class HelloWorld {
public static void main(String[] args)
{
int a[] = { 1, 13, 4, 1, 41, 31, 31, 4, 13, 2 };
// put all elements in arraylist
ArrayList<Integer> aa = new ArrayList();
for (int i = 0; i < a.length; i++) {
aa.add(a[i]);
}
HashMap<Integer, Integer> h = new HashMap();
// counting occurrence of numbers
for (int i = 0; i < aa.size(); i++) {
h.putIfAbsent(aa.get(i), Collections.frequency(
aa, aa.get(i)));
}
System.out.println(h);
}
}
{1=2, 2=1, 4=2, 41=1, 13=2, 31=2}
Java Map接口常見問題解答
Q1. Java中的Map接口是什麽?
回答:
The map contains key-value pairs, where we access elements in the map using key values.
Q2。 Java中的Map接口有哪些類型?
回答:
There are 3 map interface implementations HashMap, LinkedHashMap, and TreeMap.
相關用法
- Java Map clear()用法及代碼示例
- Java Map containsKey()用法及代碼示例
- Java Map containsValue()用法及代碼示例
- Java Map entrySet()用法及代碼示例
- Java Map equals()用法及代碼示例
- Java Map get()用法及代碼示例
- Java Map hashCode()用法及代碼示例
- Java Map isEmpty()用法及代碼示例
- Java Map keySet()用法及代碼示例
- Java Map put()用法及代碼示例
- Java Map putAll()用法及代碼示例
- Java Map remove()用法及代碼示例
- Java Map Values()用法及代碼示例
- Java Map size()用法及代碼示例
- Java Map轉Stream用法及代碼示例
- Java Map.Entry用法及代碼示例
- Java Math abs()用法及代碼示例
- Java Math acos()用法及代碼示例
- Java Math addExact()用法及代碼示例
- Java Math asin()用法及代碼示例
- Java Math atan()用法及代碼示例
- Java Math cos()用法及代碼示例
- Java Math sin()用法及代碼示例
- Java Math tan()用法及代碼示例
- Java Math sinh()用法及代碼示例
注:本文由純淨天空篩選整理自佚名大神的英文原創作品 Map Interface in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。