集合框架-MAP(java基础)

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

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值