1 接口 Map<K,V>
Map类型集合每个元素值都包含两个对象:<键,值>。并且键在Map中不能有重复对象。
类型参数:
K - 此映射所维护的键的类型
V - 映射值的类型
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
特点:
(1)存储的是键值对(键,值)
(1)集合中键唯一
小技巧:在分析需求时,出现了对应关系。
(1) 如果对应关系中出现了有序的编号,可以使用数组。
(2)如果对应关系中没有有序的编号,就可以使用map集合
2 接口Map集合方法
// 需求:存储对应的中英文星期
public static void main(String[] args) {
// 创建map集合(映射即Map,Map即映射)
Map<String,String> map = new HashMap<String,String>();
// (1)添加元素put()
/* map集合如果键相同,值就会覆盖。并且put()方法返回
以前与key对应的值,如果没有则返回 null。*/
System.out.println(map.put("小美", "小明")); // null
System.out.println(map.put("小美", "小黑")); // 小明
System.out.println(map.put("小美", "小方")); // 小黑
map.put("星期一", "Monday");
map.put("星期天", "Sunday");
// (2)通过键获取value值。如果键不存在,返回null。
System.out.println(map.get("星期天")); // Sunday
// (3)通过键获取value值并删除键值对。如果键不存在,返回null
System.out.println(map.remove("星期一")); // Monday
// (4)打印Map集合toString()可省略
System.out.println(map.toString()); // {小美=小方, 星期天=Sunday}
// (5)containsKey(Object key);判断是否存在该键
}
3 接口Map集合的打印
Map集合中没有迭代器和增强for循环,先将Map集合(双列集合)转成单列集合,在用单列集合的迭代器去进行获取。
方法一:
(1)通过keySet()方法将Map集合的键用Set集合进行存储,使用Set集合的原因是键具有唯一性。
(2)对Set集合进行遍历获取所有的键,再通过键获取get(key)所有的值。
public static void main(String[] args) {
// 创建Map集合,添加map元素
Map<String,String> map = new HashMap<String,String>();
map.put("星期一", "Monday");
map.put("星期天", "Sunday");
// 方法一:keySet()方法
// 1.获取所有的键keySet(),存储在Set集合中
Set<String> keyset = map.keySet();
// 2.对Set集合进行遍历,先获取所有的键,在通过建获取所有的值
// 对集合遍历有三种方法:(1)for循环(2)增强for循环(3)While循环
// (1) for循环
for (Iterator<String> iterator = keyset.iterator(); iterator.hasNext();) {
// 获取所有的键
String key = iterator.next();
// 获取所有的值get();
String value = map.get(key);
System.out.println(key+"----"+value);
}
// (2)增强for循环
for(String key:keyset){
String value = map.get(key);
System.out.println(key+ ">>>>" +value);
}
// (3)while循环
Iterator<String> it = keyset.iterator();
while(it.hasNext()){
String key = it.next();
String value = map.get(key);
System.out.println(key+ "对应的值:" +value);
}
}
方法二:通过entry()方法获取映射关系对象Set(Map.Entry<String,String>),在分别通过getKey()方法和getValue()获取键和值。entry()方法获取的是映射关系,Map.Entry内部接口,相当于夫妻双方的结婚证。
public static void main(String[] args) {
// 创建Map集合,并添加元素
Map<String,String> map = new HashMap<String,String>();
map.put("星期一", "Monday");
map.put("星期天", "Sunday");
// 方法二:entrySet()方法
// 返回映射中包含的映射关系(相当于结婚证)
Set<Map.Entry<String,String>> entryset = map.entrySet();
// 遍历元素,获取Set集合中映射关系对象。通过映射对象分别获取键和值
// (1)for循环
for(Iterator<Map.Entry<String,String>> iterator =
entryset.iterator();iterator.hasNext();){
//返回的是Set集合中映射关系对象
Map.Entry<String, String> me = iterator.next();
// 获取键
String key = me.getKey();
// 获取值
String value = me.getValue();
System.out.println(key+":"+value);
}
// (2)增强for循环
for(Map.Entry<String, String> me : entryset){
// 获取键
String key = me.getKey();
// 获取值
String value = me.getValue();
System.out.println(key+">>>>"+value);
}
// (3)While循环
Iterator<Map.Entry<String, String>> it = entryset.iterator();
while(it.hasNext()){
Map.Entry<String, String> me = it.next();
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"----"+value);
}
}
拓展:values()方法
获取所有的值,因为值不需要保证唯一性,所以接收值的返回值类型是Collection。
public static void main(String[] args) {
// 创建Map集合,并添加元素
Map<String,String> map = new HashMap<String,String>();
map.put("星期一", "Monday");
map.put("星期天", "Sunday");
// 获取所有的值
Collection<String> values = map.values();
// 使用高级for循环进行遍历
for(String value : values){
System.out.println("value="+value);
}
}
4 Map的实现类
HashTable:哈希表,不保证迭代的顺序。任何非 null 对象都可以用作键或值。同步。
HashMap:哈希表,不同步。允许使用null作为键或者值。
TreeMap:二叉树,不同步。可以对map集合中的键进行排序。
4.1 HashMap的应用
public static void main(String[] args) {
Map<Student,String> map = new HashMap<Student,String>();
//存储元素
map.put(new Student("小美",28), "长沙");
// 同姓名,同年龄视为同一个人。即"小哥"只输出一个
// 解决方法:HashMap底层是哈希表。重写hashcode()和equals()方法
map.put(new Student("小哥",25), "广州");
map.put(new Student("小哥",25), "内蒙古");
//取出元素
Set<Map.Entry<Student,String>> entryset = map.entrySet();
//遍历Set集合
for(Entry<Student, String> me : entryset ){
Student key = me.getKey();
String value = me.getValue();
System.out.println(key+">>>>>>>>>>>"+value);
}
}
4.2 TreeMap集合的应用
public class TreeMapDemo05 {
/*需求:学生对象(姓名,年龄)都有自己的归属地,既然有对应关系,就可
将学生对象和归属地存储到map集合中。注意:同姓名和同年龄视为重复键
(1)按照学生的年龄从小到大排序,实现自然排序。使用实现comparable的方法
(2)按照学生姓名进行排序,使用比较器
*/
public static void main(String[] args) {
// 比较器:ComparatorByName n = new ComparatorByName()
Map<Student,String> map = new
TreeMap<Student,String>(new ComparatorByName());
map.put(new Student("lisi",28),"长沙");
map.put(new Student("amo",40),"北京");
map.put(new Student("ranran",20),"武汉");
//取出元素
Set<Map.Entry<Student,String>> entryset = map.entrySet();
//遍历Set集合
for(Entry<Student, String> me : entryset ){
Student key = me.getKey();
String value = me.getValue();
System.out.println(key+">>>>>>>>>>>"+value);
}
}
}
class ComparatorByName implements Comparator<Student>{
@Override
public int compare(Student stu1, Student stu2) {
int temp = stu1.getName().compareTo(stu2.getName());
return temp == 0?stu1.getAge() - stu2.getAge():temp;
}
}