Map集合的基本概述

Map集合

Map和collection一样,也是java.util包下的一个接口,同样也是一个集合的接口,不同的是Map中存储的元素是以映射键值对的形式存在,将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值。

Map接口下有很多的子类实现了它,最常见的3个子类是HashMap,HashTabel,TreeMap,它们都是实现了Map接口,自己也有自己独特的使用方法,现在我们就来一一介绍。

1.HashMap和HashTabel

它们是基于哈希表的 Map 接口的实现的,所以它元素的排序就是按照哈希表来进行排序的,HashMap后来出现,它的线程是不同步的,而它的映射中允许出现null值;除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。

//用一个实例来说明一下
class demo01 
{
    public static void main(String[] args) 
    {
        //创建了一个HashMap对象
        HashMap<students,String> ha =
                     new HashMap<students,String>();
        ha.put(new students("brm",12),"beijing");//往里面添加元素
        ha.put(new students("arm",19),"shanghai");
        ha.put(new students("crm",16),"guangzhou");
        ha.put(new students("zrm",10),"shenzhen");


    /*  //用了keySet方法进行遍历集合
        Set<students> se = ha.keySet();
        Iterator<students> it = se.iterator();
        while(it.hasNext())
        {
            students s = it.next();
            //String key = s.toString();
            String value = ha.get(s);
            sop(s+"--"+value);
        }
    */
        //用了entrySet方法进行遍历集合
    //获得一个Set集合 
    Set<Map.Entry<students,String>> sa = ha.entrySet();
    //获得Set集合的迭代器
    Iterator<Map.Entry<students,String>> it = sa.iterator();
        while(it.hasNext())
        {
            //获得Map.Entry的对象
            Map.Entry<students,String> s = it.next();
            students key = s.getKey(); //getKey获取键
            String value = s.getValue();//getValue获取值
            sop(key+"--"+value);//输出键和值
        }

    }
    //打印
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}
//创建了一个学生类
class students
{
    private String name;
    private int age;
    private String addr;
    //构造函数
    students(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    public void getAddr(String addr)
    {
        this.addr = addr;
    }
    public String putAddr()
    {
        return addr;
    }
    public String putName()
    {
        return name;
    }
    public int putAge()
    {
        return age;
    }
    //复写了tostring方法
    public String toString()
    {
        return name+"-toString方法-"+age;
    }
}

说一下Map集合中元素的迭代,Map集合自身是没有迭代器的,它是通过keyset和entryset两个方法来获取Map集合映射关系的 Set 视图,通过Set集合中的迭代器来获取Map集合中的元素再进行输出。
keyset方法
获取Map集合里面的键集合 存在一个set集合里面(返回一个set)
然后用iterator迭代器一个一个取出 然后用get方法就可以打印出键值
entryset方法
获取的是一个键值对 然后存在set集合里面
存在形式是这样子的 Set《Map.Entry》《键类,键值类》
取出的方法是《Map.Entry》.getKey 《Map.Entry 》 .getValue

TreeMap集合
TreeMap集合底层是二叉树的,所以TreeMap是根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。TreeMap集合的线程也是不同步的,它映射中的键不能重复,值可以重复。

二叉树的一个原理图:
这里写图片描述

//用一个小程序来说明
import java.util.*;
class demo02 
{
    public static void main(String[] args) 
    {
        //创建TreeMap集合
    /*TreeMap<students,String> haa =
              new TreeMap<students,String>(new TreeMapcompare());
    传入了一个TreeMapcompare的比较器进行比较   
    */        

     //对象自身的比较性
    TreeMap<students,String> haa = newTreeMap<students,String>();
        haa.put(new students("brm",12),"beijing");
        //添加元素<学生对象,城市>
        haa.put(new students("arm",19),"shanghai");
        haa.put(new students("crm",16),"guangzhou");
        haa.put(new students("zrm",10),"shenzhen");

        //用了keySet方法进行遍历集合
        Set<students> se = haa.keySet();
        Iterator<students> it = se.iterator();
        while(it.hasNext())
        {
            students s = it.next();
            //String key = s.toString();
            String value = haa.get(s);
            sop(s+"--"+value);
        }

    }
    //打印
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}

//创建了一个学生类实现了Comparable接口
class students implements Comparable<students>
{
    private String name;
    private int age;
    private String addr;

    //复写了compareTo方法
    public int compareTo(students s)
    {
        int num = new Integer(this.age).compareTo(new Integer(s.putAge()));
        if(num == 0)
            return this.name.compareTo(s.putName());
        return num;
    }
    students(String name,int age)//构造函数
    {
        this.name = name;
        this.age = age;
    }
    public void getAddr(String addr)
    {
        this.addr = addr;
    }
    public String putAddr()
    {
        return addr;
    }
    public String putName()
    {
        return name;
    }
    public int putAge()
    {
        return age;
    }
    public String toString()//复写了tostring方法
    {
        return name+"-toString方法-"+age;
    }
}
//建立自定义的 比较器
class TreeMapcompare implements Comparator<students>
{
    public int compare(students s1,students s2)
    {
        int num = s1.putName().compareTo(s2.putName());
        if(num == 0)
            return new Integer(s1.putAge()).compareTo(new Integer(s2.putAge()));
        return num; 
    }
}

最后一点要注意的就是:
HashMap集合中是可以有重复元素的;
TreeMap集合中键不可以有重复,值可以重复,键的重复判断是由compareTo方法判断(对象类要先实现Comparable接口),或者是由传入的比较器去判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值