文章目录
- 框架
- 特点
- 常用方法
- 六大遍历方式
- 练习
框架
- 数据是K-V类型的
- 我们之前学的几个Set底层也是封装了Map,但是Value部分用默认值,我们只使用Key部分
特点
注意:这里讲的是JDK8的Map接口特点
- Map用于保存具有映射关系的数据:Key-Value
- Map 中的key 和 value可以是任何引用类型的数据,会封装到HashMap$Node对象中
- Map 中的key 不允许重复,原因和HashSet一样,前面分析过源码。(重复添加会替换掉原来Key对应的value)
- 存入和取出顺序不一定一样即无序。
- Map 中的value可以重复
- Map的key可以为null,value也可以为null,注意key为null,只能有一个,value 为null ,可以多个
- 常用String类作为Map的key,但不限于
- key 和 value 之间存在单向一对一关系,即通过指定的key总能找到对应的value
- Map存放数据的key-value示意图,一对k-v是放在一个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>>即: transient Set<Wap.Entry<K,V>> entrySet。这个集合里面的K,V分别是指向HashMap$Node node里面的数据。
- 这个EntrySet集合可以这么理解:拿到HashMap$Node node里面的key组成一个Set集合,拿到node里面的value组成一个Collection集合,然后对应的key和value组成一个Entry存放在EntrySet中。EntrySet里面的数据只是单纯的指向并没有新的数据。
- entrySet 中,定义的类型是 Map.Entry,但是实际上存放的还是HashMap&Node。那为什么可以当成Map.Entry存放呢,实际上这个HashMap&Node implements Map.Entry
- 为什么还要把HashMap&Node放在EntrySet中呢?因为 Map.Entry提供了重要方法K getKey和V getValue()。方便遍历
常用方法
- put:添加
- remove:根据键删除映射关系
- get:根据键获取值
- size:获取元素个数
- isEmpty:判断个数是否为
- clear:清除
- containsKey:查找键是否存在
详细内容:https://www.runoob.com/java/java-map-interface.html
六大遍历方式
import java.util.*;
public class Test {
@SuppressWarnings({"all"})
public static void main(String[] args) throws InterruptedException {
Map map = new HashMap();
map.put("no1",1);
map.put("no2",212);
map.put("no3",11);
map.put("no4",212);
map.put("no5",112);
map.put("no6",1232);
//第一组遍历方式,根据得到的key,
Set set = map.keySet();
// (1)增强for得到value
for (Object o : set) {
System.out.println(o+"--"+map.get(o));
}
// (2)迭代器得到value
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next+"--"+map.get(next));
}
//第二组遍历方式,得到所有的value,
Collection values = map.values();
// (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-V
Set entrySet = map.entrySet();
// (1) 增强for
for (Object entry :entrySet) {
//entry转成Map.entry
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
// (2)迭代器
Iterator iterator3 = entrySet.iterator();
while (iterator3.hasNext()) {
Object next = iterator3.next();
Map.Entry m = (Map.Entry) next;
System.out.println(m.getKey() + "-" + m.getValue());
}
}
}
练习
使用HashMap添加3个员工对象,要求:(健:员工id—值:员工对象)
并遍历显示工资>18000的员工(遍历方式最少两种员工类:姓名、工资、员工id)
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
class Emp{
private long id;
private String name;
private int salary;
public Emp(long id, String name, int salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
", salary=" + salary +
'}';
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
public class Test {
@SuppressWarnings({"all"})
public static void main(String[] args) throws InterruptedException {
Map map = new HashMap();
map.put(1,new Emp(1,"Tom",100000));
map.put(2,new Emp(2,"Jim",30000));
map.put(3,new Emp(3,"Potte",9000));
map.put(4,new Emp(4,"Kim",80000));
//方式一:得到key,增强for得到value
Set set = map.keySet();
for (Object o : set) {
Emp emp = (Emp)map.get(o);
if (emp.getSalary()>18000)
System.out.println(o+"-"+emp);
}
//方式二:得到entrySet,遍历数据
Set entrySet = map.entrySet();
Iterator iterator = entrySet.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
Map.Entry entry = (Map.Entry)next;
System.out.println(entry.getKey()+"-"+entry.getValue());
}
}
}