集合框架-MAP(java基础)

时间:2023-02-26 10:59:14

一、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接口的一个内部接口。

集合框架-MAP(java基础)


关系用代码表示为:

,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++);
}
}

}

}