在Java中,Map是一种用于存储键值对(key-value pairs)的集合类型。它提供了一种将键映射到值的方式,其中每个键在Map中都是唯一的。Map接口是java.util包中的一部分。
常用实现类:
HashMap: 基于哈希表实现的Map,它提供了平均时间复杂度为O(1)的插入、删除和查找操作。但它不保证元素的顺序。
TreeMap: 基于红黑树实现的Map,它保持元素的有序状态。它提供了基于键的排序,因此所有键对象必须实现Comparable接口或者通过构造方法传入一个Comparator对象。
LinkedHashMap: 继承自HashMap,它保持元素插入的顺序,可以按照插入顺序或者访问顺序进行迭代。
Hashtable: 类似于HashMap,但是它是线程安全的。不过,在大多数情况下,推荐使用ConcurrentHashMap来代替Hashtable。
ConcurrentHashMap: 是HashMap的线程安全版本,它提供了高效的并发访问。


此图源自:【韩顺平 零基础30天学会Java】图 Map_idea 无法查看map扩容 韩顺平-CSDN博客
常用方法:
put(K key, V value): 将指定的值与指定的键关联在一起,并放入Map中。
get(Object key): 返回指定键所映射的值,如果此Map不包含该键的映射关系,则返回null。
remove(Object key): 删除指定键及其对应的值。
containsKey(Object key): 判断Map中是否包含指定的键。
containsValue(Object value): 判断Map中是否包含指定的值。
size(): 返回Map中键值对的数量。
isEmpty(): 判断Map是否为空。
常见应用:
存储配置信息:Map可用于存储应用程序的配置信息,其中键表示配置项的名称,值表示配置项的值。这种方式使得配置信息可以轻松地被读取和修改。
Map<String, String> config = new HashMap<>();
config.put("server", "localhost");
config.put("port", "8080");
config.put("username", "admin");
config.put("password", "password");
缓存:Map可以用作缓存,其中键表示缓存的键,值表示相应的缓存数据。使用Map作为缓存可以快速查找和检索数据。
Map<String, Object> cache = new HashMap<>();
cache.put("user1", new User("John", 25));
cache.put("user2", new User("Alice", 30));
 请求参数和响应参数的映射:在Web开发中,常常使用Map来表示HTTP请求的参数和响应的参数。
Map<String, String> requestParams = new HashMap<>();
requestParams.put("username", "john");
requestParams.put("password", "password");Map<String, Object> responseParams = new HashMap<>();
responseParams.put("status", "success");
responseParams.put("message", "Login successful");
 计数器:Map可以用于计数器,其中键表示要计数的对象,值表示该对象出现的次数。
Map<String, Integer> counter = new HashMap<>();
String[] words = {"apple", "banana", "apple", "orange", "banana"};
for (String word : words) {
counter.put(word, counter.getOrDefault(word, 0) + 1);
}
 路由表:在网络编程中,Map可以用来存储路由表,其中键表示目的地址,值表示下一跳的地址。
Map<String, String> routingTable = new HashMap<>();
routingTable.put("192.168.0.1", "192.168.1.1");
routingTable.put("192.168.0.2", "192.168.1.2");
数据库结果集映射:在数据库操作中,Map可以用于将数据库查询的结果集映射为键值对,便于处理和操作数据。
Map<Integer, String> studentMap = new HashMap<>();
// 将数据库查询结果映射到Map中
ResultSet resultSet = statement.executeQuery("SELECT id, name FROM students");
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
studentMap.put(id, name);
}
遍历方法:
 使用entrySet()遍历(推荐): 这种方法使用Map.entrySet()方法返回Map中包含的所有键值对的Set视图,然后通过迭代这个Set来遍历Map。
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 15);// 遍历Map
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
使用keySet()遍历: 这种方法使用Map.keySet()方法返回Map中所有键的Set视图,然后通过迭代这个Set来遍历Map,并通过键获取对应的值。
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 15);// 遍历Map
for (String key : map.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
 使用Java 8的forEach()方法: 在Java 8及以上版本中,Map接口提供了forEach()方法,可以使用Lambda表达式来遍历Map。
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("apple", 10);
map.put("banana", 20);
map.put("orange", 15);// 使用forEach遍历Map
map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));