引子
- 班级中有很多学生,有可能出现姓名和年龄也一样的人。如表:
姓名 | 年龄 |
---|---|
张三 | 20 |
张三 | 20 |
上面的这种情况,有可能是用户输入失误导致插入的数据出现重复,也有可能这两个人只是恰巧同名同姓而已,实际上根本不是同一个人。
此时,单单用姓名无法保证插入数据的唯一性,因此采取以下措施:
- 用ID保证
- 在1的基础同时用姓名保证
Map一个键对应存储的一个值。
Map 与Collection集合的区别
- Map集合是双列集合,Collection集合是单列的。
- Map集合是靠键来保证元素唯一,Map集合的键相当于Set集合,能够保证元素唯一。值不唯一,Map集合的值相当于Collection集合的List接口。
- Map集合保证元素唯一只针对键有效。而Set集合保证元素唯一。
- 通过查看API,发现 Map 集合是一个接口:
- 接口 Map<K ,V >
- K表示键的类型
- V表示值的类型
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
基本方法
方法名 | 功能 |
---|---|
V put ( K key , V Value); | 将一个键值对添加到集合中 如果没有这个键,就添加到这个集合中并返回null; 如果已经有了这个键,那么就将这个键的值给替换,返回被替换的值。 |
V remove ( K key ); | 根据键删除元素,并返回被删除元素的值。 |
void clear ( ); | 清空集合 |
boolean containsKey ( Object key); | 判断是否包含key键 |
boolean contiansValue ( Object value); | 判断是否包含value值 |
boolean isEmpty ( ); | 判断Map是否为空 |
int size ( ); | 返回键值对个数 |
获取相关功能
方法名 | 功能 |
---|---|
V get ( Object key ); | 根据键获取值 |
Set keySet(); | 获取所有键的Set集合 |
Collection values ( ); | 获取所有值的Collection集合 |
Map 的遍历
- 先获取所有的键的Set集合,然后根据键获取值。
此方式遍历含自定义类的Map源码 - Map存储的是一个个键值对对象,可以将键值对看成一个对象,遍历键值对对象再获取其值。
- 这个键值对对象在Java中叫Entry,这个对象封装了键的信息和值的信息。因此Entry应该有对应方法获取这个对象的键和值。
- 获取键值对对象的Set集合。
- 遍历键值对对象的Set集合,获取每一个键值对对象。
- 根据键值对对象获取键和值。
此方式遍历含自定义类的Map源码
- 这个键值对对象在Java中叫Entry,这个对象封装了键的信息和值的信息。因此Entry应该有对应方法获取这个对象的键和值。
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
* 有关Map遍历普通String类型的Demo
* 方式1:先获取所有的键的Set集合,然后根据键获取值。
*/
public class MapTrversalDemo {
public static void main(String[] args) {
//创建Map集合
Map<String,String> map = new HashMap<>();
//往Map集合里添加元素
map.put("001","张三");
map.put("002", "李四");
map.put("003", "王五");
map.put("004", "赵六");
//步骤一:获取Map集合里所有的键值
Set<String> keySet = map.keySet();
//打印输出格式
System.out.println("编号\t姓名");
//根据键值获取值并打印输出
for (String keys : keySet) {
System.out.println(keys+"\t"+map.get(keys));
}
}
}
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/*
* 有关Map的遍历
* 方法2:
* Map是由多个保存了键和值的键值对的Entry对象组成的,可以遍历这些Entry对象,再通过Entry分别获取键和值。
*
*/
public class MapTrversalEntryDemo {
public static void main(String[] args) {
//创建Map对象
Map<String,String> map = new HashMap<>();
//在map中添加元素
map.put("001", "田馥甄");
map.put("002", "陈粒");
map.put("003", "谢春花");
map.put("004", "银临");
//打印输出标题
System.out.println("\t编号\t歌手");
//1. 获取键值对对象Entry的Set集合
Set<Entry<String, String>> entrySet = map.entrySet();
//2. 遍历键值对对象的Set集合,获取每一个键值对对象
for (Entry<String, String> entry : entrySet) {
//3. 根据键值对对象获取键和值
System.out.println("\t"+entry.getKey()+"\t"+entry.getValue());
}
}
}
Entry图解
- 注意:Enrty是Map的内部类,API应当在 Map 类中的嵌套类中查询。
图解如下:
Map.Entry的相关方法
方法名 | 功能 |
---|---|
K getKey ( ) | 返回与此项对应的键。 |
V getValue ( ) | 返回与此项对应的值。 |
boolean equals ( Object o ) | 比较指定对象与此项的相等性。 |
int hashCode ( ) | 返回此映射项的哈希码值。 |
V setValue ( V value ) | 用指定的值替换与此项对应的值(可选操作)。 |