一次存一对元素,分别是 键 和 值,他们是一 一对应的:
其中:
键不可以重复,值可以重复
这一对数据叫键值对、键值对对象、或 Entry
Map 的体系结构:
Map的常见API:
方式的实现:
注意 Map 接口的泛型有两个参数,一个是键,一个是值
//创建对象
Map<String,String>map=new HashMap<>();
//put:1.添加元素
map.put("喜羊羊","灰太狼");
map.put("熊大","熊二");
/* //put:2.覆盖元素
String result = map.put("喜羊羊", "美羊羊");
System.out.println(result);//灰太狼 (返回被覆盖的值)*/
/*//remove根据键删除键值对 对象
map.remove("喜羊羊");*/
/* //clear
map.clear();*/
/* //containKey
System.out.println(map.containsKey("喜羊羊"));
//containsValue
System.out.println(map.containsValue("熊二"));*/
/* //is Empty
System.out.println(map.isEmpty());*/
//size键值对个数
System.out.println(map.size());
//get
System.out.println(map.get("喜羊羊"));
//打集合
System.out.println(map);
要注意的就是 put 方法有两个作用:
- 当添加的键不存在时,会直接添加该键值对,方法返回 null
- 当添加的键存在时,会覆盖原有的键值对,并把被覆盖的值返回
Map 的遍历方式:
键找值(KeySet 方法+之前的遍历方法)
演示:
//创建集合
Map<String,String> map =new HashMap<>();
//添加键值对
map.put("喜羊羊","灰太狼");
map.put("熊大","熊二");
map.put("刘备","孙尚香");
//将键添加进set集合
Set<String> keys = map.keySet();
//遍历键---增强for
for(String key:keys){
System.out.println(key+" "+map.get(key))
}
//或者迭代器:
Iterator<String> it = keys.iterator();
while(it.hasNext()){
String str=it.next();//因为next要多次使用,最好交给一个变量
System.out.println(str+" "+map.get(str));
}
//或者lambda
keys.forEach(s-> System.out.println(s+" "+map.get(s)));
熊大 熊二
刘备 孙尚香
喜羊羊 灰太狼
键值对(entrySet+之前的遍历方法)
要知道 Entry 接口内,直接有 getKey 和 getValue 方法,遍历很方便
//创建集合
Map<String, String> m = new HashMap<>();
//添加键值对
m.put("喜羊羊", "灰太狼");
m.put("熊大", "熊二");
m.put("刘备", "孙尚香");
//将键值对放入Set集合,这个集合实现了Map.Entry接口
Set<Map.Entry<String, String>> entries = m.entrySet();
//增强for
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
//迭代器
Iterator<Map.Entry<String, String>> it = entries.iterator();
while (it.hasNext()) {
Map.Entry<String, String> e = it.next();
System.out.println(e.getKey() + " " + e.getValue());
}
//lambda表达式
entries.forEach( e-> System.out.println(e.getKey() + " " + e.getValue()));
熊大 熊二
刘备 孙尚香
喜羊羊 灰太狼
Lambda 表达式:
在 forEach 的基础上使用 Lambda 表达式
//创建集合
Map<String, String> m = new HashMap<>();
//添加键值对
m.put("喜羊羊", "灰太狼");
m.put("熊大", "熊二");
m.put("刘备", "孙尚香");
//普通forEach
m.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String Key, String Value) {
System.out.println(Key + " " + Value);
}
});
//使用lambda表达式改进
m.forEach((String Key, String Value) -> System.out.println(Key + " " + Value));
熊大 熊二
刘备 孙尚香
喜羊羊 灰太狼
forEach 底层:
//for Each其实就是利用第二种方式进行遍历,依次得到每一个键和值
//再调用accept方法