- Map与Collection并列存在。用于保存具有映射关系的数据:Key:value(双列元素)
- Map中的key和value可以是任何应用类型的数据,会封装到
HashMap$Node
对象中
- Map中的key不允许重复,原因和HashSet 一样,
- Map中的Value可以重复
- Map的key可以为null,value 也可以为null,注意key为nulll,只能由一个,value为null,可以多个
- 常用String类作为Map的key
- key和value之间存在单向一对一的关系,即通过制定的key总能找到对应的value
- Map存放数据的Key-value,一对k-v是放在一个
HashMap$Node
中的,又因为Node实现了Entry接口,有些书上也说一对k-v就是一个Entry
- k-v 最后是
HashMap$Node node = newNode(hash,key,value,null);
- k-v 为了方便程序员遍历,还会创建EntrySet集合,该集合春风的元素的类型Entry,而一个Entry对象就有k,v
EntrySet<Entry<K,V>>
- entrySet中,定义的类型是Map.Entry,但实际上存放的还是HashMap$Node,这是因为
static class Node<K,V> implements Map.Entry<K,V>
- 当吧HashMap$Node 对象存放到entrySet就方便遍历,因为
Map.Entry
提供了getKey():getValue()
方法
Map接口常用方法
package top.ltyzqhh.collection;
import java.util.HashMap;
import java.util.Map;
public class Map_ {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1","小明");
map.put("no2","张无忌");
map.put("no3",null);
map.put("no4","小红");
map.put(null,"小红");
map.put("no5","小军");
map.put("no5","小美");//“小军”会被“小美”替换
System.out.println(map);
//remove:根据键删除映射关系
map.remove(null);
System.out.println(map);
//get:根据键获取值
Object val = map.get("no4");
System.out.println("no4="+val);
//size:获取元素个数
System.out.println( map.size());
//isEmpty:判断个数是否为0
System.out.println(map.isEmpty());
//clear:清除
//map.clear();
System.out.println(map);
//containsKey:查找键是否存在
System.out.println(map.containsKey(null));
System.out.println(map.containsKey("no4"));
}
}
Map遍历
package top.ltyzqhh.collection;
import java.util.*;
public class Mapfor {
public static void main(String[] args) {
Map map = new HashMap();
map.put("no1","小明");
map.put("no2","张无忌");
map.put("no3",null);
map.put("no4","小红");
map.put(null,"小红");
map.put("no5","小军");
map.put("no5","小美");
//第一组:先取出 所有的Key ,通过Key 取出对应的Value
Set keyset = map.keySet();
//(1)增强for循环
System.out.println("==============增强for循环(keySet)==============");
for (Object key :keyset) {
System.out.println(key+"="+map.get(key));
}
//(2)迭代器
System.out.println("==============迭代器(keySet)==============");
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key+"="+map.get(key));
}
//第二组: 把所有的values取出
Collection values = map.values();
//这里可以使用所有的Collection使用的遍历方法
//增强for循环
System.out.println("============取出所有Value 增强for=========");
for (Object value :values) {
System.out.println(value+"="+map.get(value));
}
//迭代器
System.out.println("============取出所有Value 迭代器=========");
Iterator iterator1 = values.iterator();
while (iterator1.hasNext()) {
Object value = iterator1.next();
System.out.println(value+"="+map.get(value));
}
//第三组:通过EntrySet 来获取k-v
Set set = map.entrySet();
//(1)增强for
System.out.println("================使用EntrySet的for增强=================");
for (Object entry :set) {
//将entry对象转成Map.Entry
Map.Entry m =(Map.Entry) entry;
System.out.println(m.getKey()+"="+m.getValue());
}
//迭代器
System.out.println("================使用EntrySet 迭代器=================");
Iterator iterator2 = set.iterator();
while (iterator2.hasNext()) {
Object entry = iterator2.next();
Map.Entry m =(Map.Entry) entry;
System.out.println(m.getKey()+"="+m.getValue());
}
}
}