7.1 Map集合的体系
7.1.1 图示
- java.util.Map<K,V>集合中存取元素的基本单位是:单对元素,其中类型参数如下:
K - 此映射所维护的键(Key)的类型,相当于目录。
V - 映射值(Value)的类型,相当于内容。
- 该集合中key是不允许重复的,而且一个key只能对应一个value。
- 该集合的主要实现类有:HashMap类、TreeMap类、LinkedHashMap类、Hashtable类、Properties类。
7.2 HashMap类
7.2.1 HashMap类特点
-
HashMap类的底层是采用哈希表进行数据管理的。
-
LinkedHashMap类与HashMap类的不同之处在于内部维护了一个双向链表,链表中记录了元素的迭代顺序,
也就是元素插入集合中的先后顺序,因此便于迭代。
7.2.2 元素放入HashMap
- 使用元素的key调用hashCode方法获取对应的哈希码值,再由某种哈希算法计算在数组中的索引位置。
- 若该位置没有元素,则将该键值对直接放入即可。
- 若该位置有元素,则使用key与已有元素依次比较哈希值,若哈希值不相同,则将该元素直接放入。
- 若key与已有元素的哈希值相同,则使用key调用equals方法与已有元素依次比较。若相等则将对应的value修改,否则将键值对直接放入即可。
1) 代码示例
package cn.guardwhy_01;
import java.util.HashMap;
import java.util.Map;
/**
Map集合概述:
Map集合是一种双列集合,每个元素包含两个值。
Map集合的每个元素的格式:key=value(键值对元素)。
Map集合也被称为键值对集合。
Map集合的特点:
1.Map集合的特点都是由键决定的。
2.Map集合的键是无序不重复的,无索引的。Map集合后面重复的键对应的元素会覆盖前面的整个元素!
3.Map集合的值无要求。
4.Map集合的键值对都可以为null。
*/
public class MapDemo01 {
public static void main(String[] args) {
// 创建Map集合对象
Map<String, Integer> shops = new HashMap<>();
// 向集合中添加元素
shops.put("小米",10);
shops.put("小米",30); // 键重复了,后面的覆盖前面的整个元素
shops.put("huawei",1000);
shops.put("iphone11",1);
shops.put("iphone11",2);
shops.put("三星",2);
shops.put(null,null);
// 输出map集合
System.out.println("map集合:" + shops); // map集合:{null=null, huawei=1000, iphone11=2, 小米=30, 三星=2}
}
}
7.2.3 常用的方法
方法声明 | 功能介绍 |
---|---|
V put(K key, V value) | 将Key-Value对存入Map,若集合中已经包含该Key,则替换该Key所对 应的Value,返回值为该Key原来所对应的Value,若没有则返回null |
V get(Object key) | 返回与参数Key所对应的Value对象,如果不存在则返回null |
boolean containsKey(Object key) | 判断集合中是否包含指定的Key |
boolean containsValue (Object value); | 判断集合中是否包含指定的Value |
V remove(Object key) | 根据参数指定的key进行删除 |
1) 代码示例
package cn.guardwhy_01;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
Map集合的常用API:
- public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
- public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
- public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
- public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
- public boolean containKey(Object key):判断该集合中是否有此键。
*/
public class MapDemo02 {
public static void main(String[] args) {
// 1.创建Map集合对象
Map<String, Integer> maps = new HashMap<>();
// 2.向集合中添加元素
maps.put("小米",3000);
maps.put("huawei",1000);
maps.put("iphone11",6700);
maps.put("iphone11",8000);
maps.put("三星",4500);
// 3.输出map集合
System.out.println("map集合:" + maps); // map集合:{huawei=1000, iphone11=8000, 小米=3000, 三星=4500}
// 4.根据键取值
System.out.println("根据键取值:" + maps.get("小米")); // 根据键取值:3000
// 5.根据键删除整个键值对元素。
System.out.println("移除键:" + maps.remove("小米"));
// map集合(删除键值对):{huawei=1000, iphone11=8000, 三星=4500}
System.out.println("map集合(删除键值对):" + maps);
// 6.获取全部键的集合。因为键是无序不重复的,返回的是Set集合
Set<String> keys = maps.keySet();
// maps的键值:[huawei, iphone11, 三星]
System.out.println("maps的key:" + keys);
// 7.获取全部值的集合
Collection<Integer> values = maps.values();
System.out.println("maps的value:" + values); // maps的值:[1000, 8000, 4500]
// 8.判断集合是否包含某个值
System.out.println(maps.containsValue(1000)); // true
System.out.println(maps.containsValue(800)); // false
System.out.println(maps.containsValue(4500)); // true
}
}
7.3 LinkedHashMap类
7.3.1 LinkedHashMap类特点
- 元素有序不重复,无索引的,底层也是基于哈希表存储数据的,只是每个数据多了附属值。
- 每个数据多了一个链记录添加顺序。
1)代码示例
package cn.guardwhy_01;
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapDemo07 {
public static void main(String[] args) {
// 创建Map集合对象
Map<String, Integer> maps = new LinkedHashMap<>();
// 向集合中添加元素
maps.put("小米",30);
maps.put("huawei",10);
maps.put("iphone11",67);
maps.put("iphone11",80);
maps.put("三星",45);
// 遍历集合
maps.forEach((k, v) ->{
System.out.println(k + "==>" + v);
});
}
}
2) 执行结果
7.4 Map遍历
7.4.1 键找值的方式遍历
1)代码示例
package cn.guardwhy_01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
Map集合的遍历
Map集合的遍历方式:3种。
(1)键找值的方式遍历:先拿到所有的键,再遍历键获取对应值。(最简单的)
(2)键值对方式遍历。
(3)JDK 1.8开始的新技术(普遍使用了)
1.键找值的方式遍历:先拿到所有的键,再遍历键获取对应值。(最简单的)
*/
public class MapDemo03 {
public static void main(String[] args) {
// 创建Map集合对象
Map<String, Integer> maps = new HashMap<>();
// 向集合中添加元素
maps.put("小米",30);
maps.put("huawei",10);
maps.put("iphone11",67);
maps.put("iphone11",80);
maps.put("三星",45);
// 取得Map集合的全部键
Set<String> keys = maps.keySet();
// 遍历键找到相应的值
for(String key : keys){
// 根据键找到相应的值
Integer value = maps.get(key);
// 输出结果
System.out.println(key + "==>" + value);
}
}
}
7.4.2 键值对方式遍历
1)代码示例
package cn.guardwhy_01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
Map集合的遍历。
Map集合的遍历方式:3种。
(1)键找值的方式遍历:先拿到所有的键,再遍历键获取对应值。
(2)键值对方式遍历.
(3)JDK 1.8开始的新技术
2.键值对方式遍历
*/
public class MapDemo04 {
public static void main(String[] args) {
// 创建Map集合对象
Map<String, Integer> maps = new HashMap<>();
// 向集合中添加元素
maps.put("小米",30);
maps.put("huawei",10);
maps.put("iphone11",67);
maps.put("iphone11",80);
maps.put("三星",45);
// 遍历集合
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
for(Map.Entry<String, Integer> entry : entries){
// 取键
String key = entry.getKey();
// 取值
Integer value = entry.getValue();
System.out.println(key + "==>" + value);
}
}
}
7.4.3 jdk1.8新技术
1) 代码示例
package cn.guardwhy_01;
/**
Map集合的遍历方式:3种。
(1)键找值的方式遍历:先拿到所有的键,再遍历键获取对应值。(最简单的)
(2)键值对方式遍历。(老程序员用的多,更面向对象的遍历思想)
(3)JDK 1.8开始的新技术(普遍使用了)
3.JDK 1.8开始的新技术(普遍使用了)
*/
import java.util.HashMap;
import java.util.Map;
public class MapDemo05 {
public static void main(String[] args) {
// 创建Map集合对象
Map<String, Integer> maps = new HashMap<>();
// 向集合中添加元素
maps.put("小米",30);
maps.put("huawei",10);
maps.put("iphone11",67);
maps.put("iphone11",80);
maps.put("三星",45);
// 遍历集合
maps.forEach((k, v) ->{
System.out.println(k + "==>" + v);
});
}
}
2) 执行结果