Map集合没有继承Collection接口,其提供的是key到value的映射。Map中不能包含相同的key,每个key只能映射一个value,但可以有相同的value,给一个key赋两次value值,相当于更新key的value值。Map集合包括Map接口以及Map接口的所有实现类。
Map接口
Map接口中的常用方法
方法 | 功能描述 |
put(Object key,Object value) | 添加键值对 |
containsKey(Object key) | 判断集合中是否包含key的键值对,返回true或false |
containsValue(Object value) | 如果此映射将一个或多个key映射到指定值,则返回true |
get(Object key) | 返回key对应的值,如果没有返回null |
keySet() | 获取key形成的Set集合 |
entrySet() | 获取键值对形成的Set集合 |
values() | 获取value形成的Collection集合 |
【例1】
public class UpdateStu {
public static void main(String[] args) {
Map<String, String> map=new HashMap<>();//创建Map实例
map.put("01", "李同学");//向集合中添加对象
map.put("02", "魏同学");
map.put("03", null);//Map集合中允许值对象为null
Set<String> set=map.keySet();//获取Map集合中所有key对象的集合
Iterator<String> iterator=set.iterator();//创建集合迭代器(遍历各种集合)
System.out.println("key集合中的元素:");
//遍历集合
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
Collection<String> collection=map.values();//获取Map集合中所有Values值的集合
iterator=collection.iterator();
System.out.println("values集合中的元素:");
//遍历集合
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
运行结果
说明:Map集合中允许值对象为null(HashMap同时还允许键对象为null,TreeMap只允许值对象为null)
Map接口的实现类
Map接口常用的实现类有HashMap和TreeMap。建议使用HashMap类实现Map集合,因为由HashMap类实现的Map集合添加和删除映射关系效率更高。HashMap是基于哈希表的Map接口是实现,HashMap通过哈希码对其内部的映射关系进行快速查找;而TreeMap中的映射关系存在一定的顺序,如果希望Map集合中的对象也存在一定的顺序,应该使用TreeMap类实现Map集合。
- HashMap类提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
- TreeMap类不仅实现了Map接口,还实现了java.util.SortedMap接口,因此,集合中的映射关系具有一定的顺序。由于TreeMap类实现的Map集合中的映射关系是根据键对象按照一定的顺序排列的,因此不允许键对象为null。
可以通过HashMap类创建Map集合,当需要顺序输出时,再创建一个完成相同映射关系的TreeMap类实例。
【例2】 通过HashMap类实例化Map集合,并遍历该Map集合,然后创建TreeMap实例实现将集合中的元素顺序输出。
(1)首先创建Emp类,代码如下:
public class Emp {
private String e_id;
private String e_name;
public Emp(String e_id,String e_name) {
// TODO Auto-generated constructor stub
this.e_id=e_id;
this.e_name=e_name;
}
public String getE_id() {
return e_id;
}
public void setE_id(String e_id) {
this.e_id = e_id;
}
public String getE_name() {
return e_name;
}
public void setE_name(String e_name) {
this.e_name = e_name;
}
}
(2)创建一个用于测试的主类。首先创建一个Map集合,并添加集合对象。分别遍历由HashMap类与TreeMap类实现的Map集合,观察两者不同。
public class MapText {
public static void main(String[] args) {
Map<String, String> hashmap=new HashMap<>();//由HashMap实现的Map对象
//创建Emp对象
Emp emp=new Emp("351", "张三");
Emp emp2=new Emp("512", "李四");
Emp emp3=new Emp("853", "王一");
Emp emp4=new Emp("125", "赵柳");
Emp emp5=new Emp("341", "黄芪");
//将对象添加到集合中
hashmap.put(emp.getE_id(), emp.getE_name());
hashmap.put(emp2.getE_id(), emp2.getE_name());
hashmap.put(emp3.getE_id(), emp3.getE_name());
hashmap.put(emp4.getE_id(), emp4.getE_name());
hashmap.put(emp5.getE_id(), emp5.getE_name());
Set<String> set =hashmap.keySet();//获取key的集合
Iterator<String> iterator=set.iterator();
//遍历集合
System.out.println("HashMap类实现的Map集合(无序):");
while (iterator.hasNext()) {
String string=(String)iterator.next();
String name=(String)hashmap.get(string);
System.out.println(string+" "+name);
}
//创建TreeMap集合对象
TreeMap<String, String> treeMap=new TreeMap<>();
treeMap.putAll(hashmap);//向集合添加对象
Iterator<String> iterator2=treeMap.keySet().iterator();
//遍历TreeMap集合
System.out.println("TreeMap类实现的Map集合(键对象升序):");
while (iterator2.hasNext()) {
String string=(String) iterator2.next();
String name=(String) treeMap.get(string);
System.out.println(string+" "+name);
}
}
}
运行结果