在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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。