
这里讲的是JDK8的Map接口特点
Key-ValueHashMap$Node对象中null, value也可以为null,注意key为null,只能有一个,value为null,可以多个.String类作为Map的keyMap 接口的特点
Map存放数据的key-value示意图,一对k-v是放在一个HashMap$Node中的, 因为Node实现了Entry 接口,一对k- v就是一个Entry,Entry 再放到 EntrySet 里面

Key:Value 的类型:Key(Set):Value(Collection)
真正的Key:Value 是放在 HashMap$Node 中,下面的 Set 和 Collection 集合只是指向了 HashMap$Node 而已(引用),为了遍历方便

源码解读:
HashMap$Node node = newNode(hash, key, value, null);EntrySet(集合),该集合存放的元素的类型:Entry,而一个 Entry 对象就有k-v, EntrySet> transient Set> entrySet; 证明:entrySet 类型是 HashMap$EntrySet
Set set = map.entrySet();
System.out.println(set.getClass()); // HashMap$EntrySet

for (Object entry : set) {
System.out.println(entry.getClass()); // HashMap$Node
}
查看Entry源码可以发现,K getKey(); V getValue();

直观理解:就是先把 上图 中 HashMap$Node 中的 k-v 转成一个 entry ,再把 entry 放在右边图中 entrySet 中
Set set = map.keySet();
System.out.println(set.getClass());
Collection values = map.values();
System.out.println(values.getClass());

Map map = new HashMap();
map.put("bookName", new Book("未来的未来", 100));//OK
map.put("bookName", "老人与海");//替换
map.put("n1", "xdr");//OK
map.put("name", "兮动人");//OK
map.put("age", null);//OK
map.put(null, "2233");//OK
map.put("xdr", "xdr630");//OK
System.out.println("map=" + map);

map.remove(null);
System.out.println("map=" + map);

Object val = map.get("name");
System.out.println("val=" + val);

System.out.println("k-v=" + map.size());

System.out.println(map.isEmpty());

6.clear:清除k-v
map.clear();
System.out.println("map=" + map);

System.out.println(map.containsKey("name"));


Map map = new HashMap();
map.put("n1", "xdr");
map.put("n2", "兮动人");
map.put("n3", null);
map.put(null, "2233");
map.put("xdr", "xdr630");
Set keyset = map.keySet();
//(1) 增强for
System.out.println("-----第一种方式-------");
for (Object key : keyset) {
System.out.println(key + "-" + map.get(key));
}
//(2) 迭代器
System.out.println("----第二种方式--------");
Iterator iterator = keyset.iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println(key + "-" + map.get(key));
}

values 取出Collection values = map.values();
//这里可以使用所有的Collections使用的遍历方法
//(1) 增强for
System.out.println("---取出所有的value 增强for----");
for (Object value : values) {
System.out.println(value);
}
//(2) 迭代器
System.out.println("---取出所有的value 迭代器----");
Iterator iterator2 = values.iterator();
while (iterator2.hasNext()) {
Object value = iterator2.next();
System.out.println(value);
}

EntrySet 来获取 k-vSet entrySet = map.entrySet();// EntrySet>
//(1) 增强for
System.out.println("----使用EntrySet的增强for----");
for (Object entry : entrySet) {
//为了方便遍历,将entry 转成 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
//(2) 迭代器
System.out.println("----使用EntrySet的迭代器----");
Iterator iterator3 = entrySet.iterator();
while (iterator3.hasNext()) {
Object entry = iterator3.next();
//System.out.println(next.getClass());//HashMap$Node -实现-> Map.Entry (getKey,getValue)
//向下转型 Map.Entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}

public class MapExercise {
public static void main(String[] args) {
Map hashMap = new HashMap();
//添加对象
hashMap.put(1, new Emp("xdr", 30000, 1));
hashMap.put(2, new Emp("mike", 20000, 2));
hashMap.put(3, new Emp("jack", 10000, 3));
//遍历2种方式
//并遍历显示工资>18000的员工(遍历方式最少两种)
//1. 使用keySet -> 增强for
Set keySet = hashMap.keySet();
System.out.println("====增强for遍历方式====");
for (Object key : keySet) {
//先获取value
Emp emp = (Emp) hashMap.get(key);
if(emp.getSal() >18000) {
System.out.println(emp);
}
}
//2. 使用EntrySet -> 迭代器
Set entrySet = hashMap.entrySet();
System.out.println("======迭代器遍历方式======");
Iterator iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry)iterator.next();
//通过entry 取得key 和 value
Emp emp = (Emp) entry.getValue();
if(emp.getSal() > 18000) {
System.out.println(emp);
}
}
}
}
class Emp {
private String name;
private double sal;
private int id;
// 省略 set/get toString 构造方法
}
