文章目录
一、Map集合
1.1Map集合介绍
- Map集合称为双列集合,格式:{key1=value1, key2=value2, key3=value3……}
- Map集合的每个元素“key=value”称为一个键值对/键值对对象/一个Entry对象,Map集合也被叫做“键值对集合”
- Map集合里key不可以重复,value可以重复
- Map集合里key和value一一对应
//导入类
import java.util.*;
import java.util.Map;
import java.util.HashMap;
//创建map对象
Map<String,Integer> map = new HashMap<>();
1.2Map集合体系
- HashMap: 无序、不重复、无索引;(用的最多 )
- LinkedHashMap: 有序、不重复、无索引。
- TreeMap:按照大小默认升序排序、不重复、无索引。
二、Map集合常用方法
public V put(K key,V value);//添加键值对对象(键,值)
public int size();//获取集合大小
public void clear();//清空集合
public boolean isEmpty();//判断集合是否为空,为空返回true,反之false
public V get(Object key);//根据键获取对应值
public V remove(Object key);//根据键删除整个元素,返回被删除键的值
public boolean containsKey(Object key);//判断是否包含某个键
public boolean containsValue(Object value);//判断是否包含某个值
public Set<K> keySet();//获取Map集合全部键
public Collection<V> values();//获取Map集合的全部值
具体案例:
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
//创建map对象
Map<String,Integer> map = new HashMap<>();
//1.map.put(K,V);往map对象添加键值对
map.put("A",11);
map.put("A",12);
map.put("B",13);
map.put("C",13);
map.put("D",16);
map.put(null,null);
System.out.println("map所有键值对是"+map);
//2.map.size();获取集合大小
System.out.println("map的大小是"+map.size());
//3.清空集合
//map.clear();
//4.map.isEmpty();判断集合是否为空
System.out.println("map为空是"+map.isEmpty());
//5.map.get(Object key);根据键获取对应值
System.out.println("map键为A的值是"+map.get("A"));
//6.map.remove(Object key);根据键删除整个元素,返回被删除键的值
System.out.println("map删除键为A的值是"+map.remove("A"));
//7.map.containsKey(Object key);判断是否包含某个键
System.out.println("map包含键A是"+map.containsKey("A"));
//8.map.containsValue(Object value);判断是否包含某个值
System.out.println("map包含值13是"+map.containsValue(13));
//9.public Set<K> keySet();获取Map集合全部键
Set<String> keys = map.keySet();
System.out.println("map所有的键是"+keys);
//10.public Collection<V> values();获取Map集合的全部值
Collection<Integer> values = map.values();
System.out.println("map所有的键是"+values);
//11.将其他Map集合内容导入到指定Map集合
Map<String,Integer> map2 = new HashMap<>();
map2.put("Q",60);
map2.put("H",99);
map.putAll(map2);
System.out.println("添加后的Map为"+map);
}
}
三、Map集合遍历方法
数据准备:
//创建map对象
Map<String,Integer>map = new HashMap<>();
map.put("ItemA",14);
map.put("ItemB",16);
map.put("ItemC",11);
map.put("ItemD",19);
map.put("ItemE",22);
3.1键找值
//方法一:键找值
//1.获取map的全部键key
Set<String> key = map.keySet();
//2.遍历全部的键,获取键对应的值
for(String keys:key){
int value = map.get(keys);
System.out.println(keys+"->"+value);
}
3.2把键值对看成一个整体进行遍历
//调用Map集合提供entrySet方法,把Map集合转换成键值对类型的Set集合
Set<Map.Entry<String,Integer>> entries = map.entrySet();
for(Map.Entry<String,Integer> entry:entries){
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"->"+value);
}
3.3Lambda表达式
map.forEach((k,v)->{
System.out.println(k+"->"+v);
});
完整代码:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class Traversal {
public static void main(String[] args) {
Map<String,Integer>map = new HashMap<>();
map.put("ItemA",14);
map.put("ItemB",16);
map.put("ItemC",11);
map.put("ItemD",19);
map.put("ItemE",22);
// //方法一:键找值
// //1.获取map的全部键key
// Set<String> key = map.keySet();
//
// //2.遍历全部的键,获取键对应的值
// for(String keys:key){
// int value = map.get(keys);
// System.out.println(keys+"->"+value);
// }
// //方法二:把键值对看成一个整体进行遍历
// Set<Map.Entry<String,Integer>> entries = map.entrySet();
// for(Map.Entry<String,Integer> entry:entries){
// String key = entry.getKey();
// Integer value = entry.getValue();
// System.out.println(key+"->"+value);
// }
//方法三:Lambda表达式
map.forEach((k,v)->{
System.out.println(k+"->"+v);
});
}
}
四、常用的Map实现类
4.1 HashMap
特点:HashMap 是基于哈希表实现的 Map 集合,它提供了快速的查找、插入和删除操作。HashMap 允许键和值为 null,并且不保证键值对的顺序。
使用案例:适用于大部分的键值对存储需求,例如缓存、快速查找等场景。
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
//创建HashMap对象,无序、不重复、无索引
Map<String,Integer> hashMap = new HashMap<>();
hashMap.put("HA",16);
hashMap.put("HC",16);
hashMap.put("HF",18);
hashMap.put("HG",10);
hashMap.put("HQ",1);
hashMap.put(null,null);
hashMap.forEach((k,v)->{
System.out.println(k+"->"+v);
});
}
}
4.2 LinkedHashMap
特点:LinkedHashMap 继承自 HashMap,通过双向链表维护插入顺序或者访问顺序。它允许键和值为空,并且可以保持元素的插入顺序或访问顺序。
使用案例:适用于需要按特定顺序访问键值对的场景,也可以用于实现 LRU 缓存。
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapDemo {
public static void main(String[] args) {
//创建LinkedHashMap对象,有序、不重复、无索引
Map<String,Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("LA",16);
linkedHashMap.put("LB",48);
linkedHashMap.put("LE",45);
linkedHashMap.put("LC",-18);
linkedHashMap.put("LD",4);
linkedHashMap.put(null,null);
linkedHashMap.forEach((k,v)->{
System.out.println(k+"->"+v);
});
}
}
4.3 TreeMap
特点:TreeMap 是基于红黑树实现的有序 Map 集合,它提供了按键的自然顺序或自定义顺序进行排序。TreeMap 不允许键为空,但允许值为空。
使用案例:适用于需要按照键的顺序进行存储和遍历的场景,例如实现一个有序映射。
import java.util.Map;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
//创建treeMap对象,按照大小默认升序排序、不重复、无索引。
Map<String,Integer> treeMap = new TreeMap<>();
treeMap.put("TC",15);
treeMap.put("TG",10);
treeMap.put("TE",15);
treeMap.put("TK",46);
treeMap.put("TZ",12);
treeMap.put("TA",null);
//treeMap.put(null,null);不允许键为空
treeMap.forEach((k,v)->{
System.out.println(k+"->"+v);
});
}
}
五、案例分析
当我们想要统计一串字符中的单词个数时,可以使用 HashMap 来实现。我们可以按照空格分割字符,然后统计每个单词的出现次数。
import java.util.HashMap;
import java.util.Map;
public class Demo {
public static void main(String[] args) {
String text = "Hello, this is a simple example. Hello again.";
// 创建一个 HashMap 用于统计单词出现的次数
Map<String, Integer> wordCountMap = new HashMap<>();
// 按空格分割字符串,并统计单词出现的次数
String[] words = text.split("\\s+"); // 以空格作为分隔符
for (String word : words) {
// 去除标点符号
word = word.replaceAll("[^a-zA-Z]", "").toLowerCase();
// 统计单词次数
if (!word.isEmpty()) {
//往 HashMap 中存入单词和其对应的出现次数,如果这个单词之前没有出现过,它的出现次数被初始化为 1;
//如果这个单词之前已经出现过,它的出现次数会在原有基础上加 1。
wordCountMap.put(word, wordCountMap.getOrDefault(word, 0) + 1);
}
}
// 输出统计结果
System.out.println("单词统计结果:");
wordCountMap.forEach((k,v)->{
System.out.println(k+":"+v);
});
}
}