Map接口集合是一种键值映射。规定了键值对集合应该具有的功能
Map实现类
Map接口的实现类也有很多,如HashMap LinkedHash MapTreeMap .....
其中最常用就是HashMap
写法:
HashMap<K, V> map = new HashMap<>()
Key:键,在同一个map对象中不能有重读的key出现
Value:值,任意 null
例如:
HashMap<String,int> map = new HashMap<String,int>();错误
HashMap<String,Integer> m = new HashMap<String,Integer>();正确
解决这个问题,jdk给每个基础数据类型,都设计一个对应的类,这些类称为基础数据类型的包装类。
数据类型 | 基础数据类型的包装类 |
int | Integer |
char | Charactor |
long | Long |
short | Short |
float | Float |
double | Double |
boolean | Doolean |
byte | Byte |
特点:
双列表形式存储数据,由键和值组成
方法:
clear()
清空所有映射关系
put(key,value)
将键值对添加到Map中
- m.put("张芳", 91);
- m.put("刘波", 79);
remove(key)
删除该key对应的键值对
containsKey(key)
查询Map中是否有这个Key
- boolean b1 = m.containsKey("张三");
containsValue(value)
查询Map中是否有这个Value
get(key)
返回该键所对应的值
size()
键值对的数量
keySet()
获取Map中所有的Key的集合返回一个Set类型的集合
- for (String key : m.keySet()) {
- System.out.println(key + " :" + m.get(key));
- }
values()
获取Map中所有的Value的集合返回一个Collection类型的集合
- int num=0;
- //values方法,获取Map中的所有的value值,放入
- Collection<Integer> c = m.values(); Collection是集合的总称, List,Set都属于Collection的
- for(Integer i:c){
- if(i>90){
- num++;
- }
- }
HashMap特征:
- 存储顺序和添加顺序无关
- Key不能重复,如果插入的新键值对的Key重复,会将新键值对的value值替换原键值对的value值
m.put("宋燕", 59);
m.put("宋燕",58);
System.out.println(m);//{宋燕=58}
HashMap的foreach遍历删除陷阱
代码:
m.put("刘静", 68);
m.put("宋燕", 59);
m.put("宋燕",58);
Set<String> s = m.keySet();
for (String name :s) {
System.out.println(s);
if(m.get(name)<60){
m.remove(name);
}
}
报错是ConcurrentModificationException
分析
foreach遍历集合时,改变了集合的结构,程序就会报错
解决
创建副本是克隆
正确代码:
m.put("张芳", 91);
m.put("刘波", 79);
m.put("吴勇", 86);
m.put("孙旭", 80);
m.put("刘静", 68);
m.put("宋燕", 59);
//6 删除成绩小于70分的学生
//Map的遍历
//创建副本,避免集合的遍历删除陷阱
HashMap<String,Integer> m2 = (HashMap<String, Integer>) m.clone();
Set<String> s = m2.keySet();
for (String name :s) {
System.out.println(s);
if(m2.get(name)<70){
m.remove(name);
}
}
System.out.println(m);