76.md 6.1 KB
Newer Older
W
wizardforcel 已提交
1
# Java `Map`接口
W
wizardforcel 已提交
2 3 4

> 原文: [https://www.programiz.com/java-programming/map](https://www.programiz.com/java-programming/map)

W
wizardforcel 已提交
5
#### 在本教程中,我们将学习 Java `Map`接口及其方法。
W
wizardforcel 已提交
6

W
wizardforcel 已提交
7
Java 集合框架的`Map`接口提供了映射数据结构的功能。
W
wizardforcel 已提交
8 9 10 11 12

它实现了`Collection`接口。

* * *

W
wizardforcel 已提交
13
## 映射的工作原理
W
wizardforcel 已提交
14 15 16 17 18 19 20 21 22

在 Java 中,`Map`的元素存储在**键/值**对中。 **键**是与各个**值**相关联的唯一值。

映射不能包含重复的键。 并且,每个键都与一个值相关联。

![Working of the map interface in Java](img/581cb6ad9550fa6092eb8b7a9b664d32.png)

我们可以使用与它们关联的键来访问和修改值。

W
wizardforcel 已提交
23
在上图中,我们具有以下值:`Amarica``Brazil``Spain`。 并且我们有相应的键:`us``br``es`
W
wizardforcel 已提交
24 25 26

现在,我们可以使用它们的对应键访问这些值。

W
wizardforcel 已提交
27
**注意**`Map`接口维护 3 个不同的集合:
W
wizardforcel 已提交
28

W
wizardforcel 已提交
29 30 31
*   键集
*   值集
*   键/值关联(映射)集。
W
wizardforcel 已提交
32 33 34 35 36

因此,我们可以分别访问键,值和关联。

* * *

W
wizardforcel 已提交
37
## 实现`Map`的类
W
wizardforcel 已提交
38 39 40 41 42

由于`Map`是一个接口,因此我们无法从中创建对象。

为了使用`Map`接口的功能,我们可以使用以下类:

W
wizardforcel 已提交
43 44 45 46 47
*   [`HashMap`](/java-programming/hashmap "Java HashMap class")
*   [`EnumMap`](/java-programming/enummap "Java EnumMap Class")
*   [`LinkedHashMap`](/java-programming/linkedhashmap "Java LinkedHashMap class")
*   [`WeakHashMap`](/java-programming/weakhashmap "Java WeakhashMap class")
*   [`TreeMap`](/java-programming/treemap "Java TreeMap class")
W
wizardforcel 已提交
48 49 50 51 52 53 54

这些类在集合框架中定义,并实现`Map`接口。

![HashMap, TreeMap, EnumMap, LinkedHashMap and WeakHashMap classes implements the Java Map interface.](img/3ffcb028eef2a45a36fc9b9879d9c20c.png)

* * *

W
wizardforcel 已提交
55
## 扩展`Map`的接口
W
wizardforcel 已提交
56 57 58 59 60 61 62 63 64 65 66

`Map`接口还通过以下子接口扩展:

*   [SortedMap](/java-programming/sortedmap "Java SortedMap Interface")
*   [NavigableMap](/java-programming/navigablemap "Java NavigableMap Interface")
*   [ConcurrentMap](/java-programming/concurrentmap "Java ConcurrentMap Interface")

![SortedMap, NavigableMap and ConcurrentMap extends the Java Map interface.](img/bfc831962cafd6e0976fad0a76ded6e5.png)

* * *

W
wizardforcel 已提交
67
## 如何使用映射?
W
wizardforcel 已提交
68

W
wizardforcel 已提交
69
在 Java 中,必须导入`java.util.Map`包才能使用`Map`。 导入包后,将按照以下方法创建映射。
W
wizardforcel 已提交
70 71 72 73 74 75

```java
// Map implementation using HashMap
Map<Key, Value> numbers = new HashMap<>(); 
```

W
wizardforcel 已提交
76
在上面的代码中,我们创建了一个名为`number``Map`。 我们已经使用`HashMap`类来实现`Map`接口。
W
wizardforcel 已提交
77 78 79

这里,

W
wizardforcel 已提交
80 81
*   `key` - 用于关联映射中每个元素(值)的唯一标识符
*   `value` - 映射中与按键相关联的元素
W
wizardforcel 已提交
82 83 84

* * *

W
wizardforcel 已提交
85
## 映射方法
W
wizardforcel 已提交
86 87 88

`Map`接口包含`Collection`接口的所有方法。 这是因为`Collection``Map`的超级接口。

W
wizardforcel 已提交
89
除了`Collection`接口中可用的方法外,`Map`接口还包括以下方法:
W
wizardforcel 已提交
90

W
wizardforcel 已提交
91 92 93
*   **`put(K, V)`** - 将键`K`和值`V`的关联插入到映射中。 如果键已经存在,则新值将替换旧值。
*   **`putAll()`** - 将指定映射中的所有条目插入此映射。
*   **`putIfAbsent(K, V)`** - 如果键`K`尚未与值`V`关联,则插入关联。
W
wizardforcel 已提交
94 95
*   **`get(K)`** - 返回与指定键`K`关联的值。 如果找不到键,则返回`null`
*   **`getOrDefault(K, defaultValue)`** - 返回与指定键`K`关联的值。 如果未找到键,则返回`defaultValue`
W
wizardforcel 已提交
96 97 98 99 100 101 102 103 104
*   **`containsKey(K)`** - 检查映射中是否存在指定的键`K`
*   **`containsValue(V)`** - 检查指定值`V`是否存在于映射中。
*   **`replace(K, V)`** - 用新的指定值`V`替换键`K`的值。
*   **`replace(K, oldValue, newValue)`** - 仅当键`K`时,才将键`K`的值替换为新值`newValue`与值`oldValue`关联。
*   **`remove(K)`** - 从键`K`表示的映射中删除条目。
*   **`remove(K, V)`** - 从映射中删除具有与值`V`关联的键`K`的条目。
*   **`keySet()`** - 返回映射中存在的所有键的集合。
*   **`values()`** - 返回映射中存在的所有值的集合。
*   **`entrySet()`** - 返回映射中存在的所有键/值映射的集合。
W
wizardforcel 已提交
105 106 107

* * *

W
wizardforcel 已提交
108
## `Map`接口的实现
W
wizardforcel 已提交
109

W
wizardforcel 已提交
110
**1.`HashMap`实现类**
W
wizardforcel 已提交
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156

```java
import java.util.Map;
import java.util.HashMap;

class Main {

    public static void main(String[] args) {
        // Creating a map using the HashMap
        Map<String, Integer> numbers = new HashMap<>();

        // Insert elements to the map
        numbers.put("One", 1);
        numbers.put("Two", 2);
        System.out.println("Map: " + numbers);

        // Access keys of the map
        System.out.println("Keys: " + numbers.keySet());

        // Access values of the map
        System.out.println("Values: " + numbers.values());

        // Access entries of the map
        System.out.println("Entries: " + numbers.entrySet());

        // Remove Elements from the map
        int value = numbers.remove("Two");
        System.out.println("Removed Value: " + value);
    }
} 
```

**输出**

```java
Map: {One=1, Two=2}
Keys: [One, Two]
Values: [1, 2]
Entries: [One=1, Two=2]
Removed Value: 2 
```

要了解有关`HashMap`的更多信息,请访问 [Java HashMap](/java-programming/hashmap "Java HashMap Class")

* * *

W
wizardforcel 已提交
157
**2.`TreeMap`实现类**
W
wizardforcel 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185

```java
import java.util.Map;
import java.util.TreeMap;

class Main {

    public static void main(String[] args) {
        // Creating Map using TreeMap
        Map<String, Integer> values = new TreeMap<>();

        // Insert elements to map
        values.put("Second", 2);
        values.put("First", 1);
        System.out.println("Map using TreeMap: " + values);

        // Replacing the values
        values.replace("First", 11);
        values.replace("Second", 22);
        System.out.println("New Map: " + values);

        // Remove elements from the map
        int removedValue = values.remove("First");
        System.out.println("Removed Value: " + removedValue);
    }
} 
```

W
wizardforcel 已提交
186
**输出**
W
wizardforcel 已提交
187 188 189 190 191 192 193 194

```java
Map using TreeMap: {First=1, Second=2}
New Map: {First=11, Second=22}
Removed Value: 11 
```

要了解有关`TreeMap`的更多信息,请访问 [Java TreeMap](/java-programming/treemap "Java TreeMap Class")