一、Map集合简介以及基本方法:
MAP集合:该集合存储键值对,一对一对往里弄,而且要保证键的唯一性。
1.添加
put(K key,V value);
2.删除
clear();
remove(object key);
3.判断
containsKey(object key);
containsValue(object value);
4.获取
get(object key);
size();
value();
重点讲:
entrySet()---返回此映射中包含的映射关系的 Set 视图。
keySet()-----返回此映射中包含的键的 Set 视图。
Map
|--Hashtable:底层是hash表数据结构,不可以存入null键,null值.该集合是线程同步的。效率低
|--HashMap:底层是hash表数据结构,并允许使用null键,null值.不是线程同步的。效率高
|--TreeMap:低层是二叉树,线程不同步。可以对map中的键进行排序。
和Set很像,
其实大家,Set底层就是使用了map集合。
public static void sop(Object obj)
{
System.out.println(obj);
}
Map<String,String> map = new HashMap<>();
//添加元素,如果出现添加时候,相同的键。那么后添加的值会覆盖原有键对应的值。并put方法会返回被覆盖的值
map.put("01", "lisa1");
map.put("02", "lisa2");
map.put("03", "lisa3");
// sop("containsKey:"+map.containsKey("01")); //判断
// sop("remove:"+map.remove("22"));
// sop("get:"+map.get("01"));
map.put(null, "lisanull");
map.put("04", null);
// sop("getnull:"+map.get(null));//获取key为空的map
// sop("get04:"+map.get("04"));//获取04号的值
sop(map.put("05", "lisa05"));//第一次存
sop(map.put("05", "lisa005"));//第二次存,覆盖第一次的值,并返回第一次的值。
//获取map集合中所有的值
Collection <String> coll = map.values();
sop(coll);
sop(map);
二、Map集合的两种取出方式
map集合的两种取出方式:
1.KrySet: 将map中所有的键存入到set集合。因为set具有迭代器。所有可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值。
返回:Set<key>
2.entrySet:返回此映射中包含的映射关系的 Set 视图。将map集合中的映射关系存入set集合中,而这个关系的数据类型就是Map.Entry。
返回:Set<Map,Entry<k,v>>
Kryset方法:
Map <String,String> map = new HashMap<String,String>();
map.put("01", "lisa01");
map.put("02", "lisa02");
map.put("03", "lisa03");
//先获取map集合的所有键的Set集合,KeySet();
Set<String> KeySet = map.keySet();
//转换为Set集合后,用迭代器输出。
for(Iterator<String> it = KeySet.iterator();it.hasNext();)
{
String key = it.next();
sop("Key:"+key+" key对应的值:"+map.get(key));
}
entryset方法:
entrySet:返回此映射中包含的映射关系的 Set 视图。将map集合中的映射关系存入set集合中,而这个关系的数据类型就是Map.Entry。
返回:Set<Map,Entry<k,v>>
Map.Entry 其实entry也是一个借口,他是map接口的一个内部接口。
关系用代码表示为:
,interface Map
{
public static interface Entry//内部接口,属于map接口
{
public abstract Object getKey();
public abstract Object getValue();
}
}
class HashMap implements Map//继承map接口
{
class Hahs implements Entry //内部类,继承子接口
{
public Object getKey(){}
public Object getValue(){}
}
}
示例代码:
Map <String,String> map = new HashMap<String,String>();
map.put("01", "lisa01");
map.put("02", "lisa02");
map.put("03", "lisa03");
//将Map集合中的映射关系取出,存入到set集合中。
Set<Map.Entry<String,String>> entrySet = map.entrySet();
for(Iterator<Map.Entry<String,String>> it = entrySet.iterator();it.hasNext();)
{
Map.Entry<String,String> me = it.next();
String key = me.getKey();//取出key和value
String value = me.getValue();
sop(key+"-------"+value);
}
三、Map练习
HashMap是无序的,treeMap才可进行排序操作。
package Container;
import java.util.*;
/*
每一个学生都有对应的归属地。
学生Student,地址String。
学生属性:姓名,年龄。
注意:姓名和年龄相同视为同一学生,保证学生唯一性。这里要重写hashCode方法和eques方法。
思考过程:
1、描述学生
2、定义map容器,将学生视为键,地址作为值。存入
3、获取map集合中的元素。
4、升序排序输出。按姓名排序。
*/
class StuNameComparator implements Comparator<Student1>//比较器,优先比较姓名。
{
public int compare(Student1 s1,Student1 s2)
{
int num = s1.getName().compareTo(s2.getName());
if(num==0)
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
return num;
}
}
class Student1 implements Comparable<Student1>
{
private String name;
private int age;
Student1(String name,int age)//构造方法
{
this.name= name;
this.age = age;
}
//重写compareTo方法
public int compareTo(Student1 s)
{
System.out.println("paixu!");
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num == 0)
{
return this.name.compareTo(s.name);//年龄相同比较名字
}
return num;
}
//重写hashCode方法,否则计算机不能识别hash内部的比较。
public int hashCode()
{
return name.hashCode()+age*34;
}
//重写equals方法
public boolean equals(Object obj)//这里不能写泛型,这里是固定的
{
if(!(obj instanceof Student1))
throw new ClassCastException("类型不匹配");//扔出一个异常
Student1 s = (Student1)obj;
return this.name.equals(s.name) && this.age ==s.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return name + ":" + age;
}
}
public class Map_exercise1
{
public static void main(String[] args)
{
TreeMap<Student1,String> hm = new TreeMap<Student1,String>(new StuNameComparator());
hm.put(new Student1("blisa01",12), "BeiJing");
hm.put(new Student1("alisa02",13), "Shanghai");
// hm.put(new Student1("lisa02",13), "TianJing");
hm.put(new Student1("aisa03",14), "NanJing");
hm.put(new Student1("lisa04",15), "ChengDu");
//第一种取出方式 keySet
Set<Student1> keySet = hm.keySet();
for(Iterator<Student1> it = keySet.iterator();it.hasNext();)
{
Student1 stu = it.next();
String addr = hm.get(stu);
System.out.println(stu +"-----"+addr);
}
System.out.println("--------------------------------------1");
//第二种取出方式
Set <Map.Entry<Student1, String>> entrySet = hm.entrySet();
for(Iterator<Map.Entry<Student1, String>> it = entrySet.iterator();it.hasNext();)
{
Map.Entry<Student1, String> me = it.next();
String addr = me.getValue();
Student1 stu = me.getKey();
System.out.println(stu+"----"+addr);
}
}
}
练习二:
map拓展知识。
map集合被使用是因为具备映射关系。
题目:学校有多个班级 大班、中班、小班.每个班级有n个人,都有对应的姓名和编号。
package Container;
/*
map拓展知识。
map集合被使用是因为具备映射关系。
题目:学校有多个班级 大班、中班、小班.每个班级有n个人,都有对应的姓名和编号。
*/
import java.util.*;
public class MapDemo4
{
public static void main(String[] args)
{
HashMap<String,String> cla_big = new HashMap<>();//大班
cla_big.put("01", "zhangsan");
cla_big.put("02", "lisi");
HashMap<String,String> cla_small = new HashMap<>();//小班
cla_small.put("01", "wangwu");
cla_small.put("02", "zhaoli");
HashMap<String,HashMap<String,String>> school = new HashMap<>();//学校
school.put("pczx",cla_big);
school.put("pczc",cla_small);
getSchool(school);//遍历学生
}
public static void getSchool(HashMap<String,HashMap<String,String>> hm)//找出学校里所有的学生
{
int i= 0;
for(Iterator<String> it = hm.keySet().iterator();it.hasNext();)//获取学校里的班级的key值
{
String id = it.next();
HashMap<String,String> room = hm.get(id);
for(Iterator<String> itor = room.keySet().iterator();itor.hasNext();)//获取学校里每个班级学生的key值
{
String ID = itor.next();
String name = room.get(ID);
System.out.println("姓名:"+name+" "+"ID:"+ID);
System.out.println("------------"+i++);
}
}
}
}