黑马程序员 Map集合

---------- android培训java培训、期待与您交流! ----------

Map集合


概述

 Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,即键(Key)

特点

  1、该集合存储键值对,一对一对往里存

  2、要保证键的唯一性。

常用方法

  1、添加: 

     添加单个元素:put(k key,V value) 

     添加一个集合:putAll(Map<? extends K,? extends V> m)

  2、删除:

     获取并移除:remove(Object key);

     清空集合中元素:clear (Object key)

  3、判断:

     判断集合是否为空: isEmpty();

     键对应的值是否存在:containsKey(Object key); 

     值对应的键是否存在:containsValue(Object obj)  返回boolean类型

  4、获取:   

     获取单个元素:get(Object key); 

     获取长度:size();

     获取Map集合中的所有值(value),返回Conllection集合。

 :a.也可以通过get()方法的返回值来判断一个键是否存在,通过返回null来判断。

     b.其中put方法:如果出现添加相同的键,那么后添加的值会覆盖原有键对应的值,并且该方法返回被覆盖的值即原值。

/**
 * Map集合方法 
*/  
import java.util.*;  
class MapDemo   
{  
    public static void sop(Object obj)  
    {  
        System.out.println(obj);  
    }  
    public static void main(String[] args)   
    {  
        //创建Map集合,并添加元素  
        Map<Integer,String> map = new HashMap<Integer,String>();  
        map.put(1,"zhangsan");  
        map.put(2,"lisi");  
        map.put(3,"wangwu");  
        map.put(4,"heihei");  
        map.put(5,"xixi");  
        //获取长度  
        int n = map.size();  
        //打印元素  
        sop("原集合:" + map + "\n长度为:" + n);  
        sop("---------------------------------------");  
        //创建新集合,并添加元素  
        Map<Integer,String> m = new HashMap<Integer,String>();  
        m.put(7,"zann");  
        m.put(9,"hewi");  
        m.put(13,"wangfei");  
        m.put(14,"huxi");  
        m.put(10,"anch");  
        //用putAll将元素添加到原集合中  
        map.putAll(m);  
        sop("putAll --新集合:" + map);  
        sop("----------------------------------");  
        //删除元素  
        sop("remove:" + map.remove(01));  
        sop("新集合:" + map);  
        sop("----------------------------------");  
        /* 
        //清空集合中的元素 
        map.clear(); 
        sop("新集合:" + map); 
        //判断是否为空集合 
        boolean be = map.isEmpty(); 
        sop("isEmpty ,null? :" + be); 
        sop("----------------------------------"); 
        */  
  
        //判断元素是否存在  
        boolean bk = map.containsKey(01);  
        boolean bv = map.containsValue("wangwu");  
        sop("判断:\n01?:" + bk + "-----  wangwu?:" + bv);  
        sop("----------------------------------");  
          
        //获取元素:get  
        String s = map.get(01);  
        String s1 = map.get(02);  
        //Integer i =  map.get("lisi");  
        //Integer i2 = map.get("zhangsan");  
        sop(map.get("lisi"));  
        sop(map.get("zhangsan"));   
        sop("获取元素get:01:" + s + ",02:" + s1);  
        sop("-----------------------------------------------");  
        //获取集合中的所有元素:Value  
        Collection<String>  coll = map.values();  
        sop("value--获取集合中所有元素:" + coll);  
        sop("----------------------------------");




Map集合中的子类:

  1、HashTable:

     特点 底层是哈希表数据结构,不可存入null键和null值。该集合是线程同步的,效率较低

  2、HashMap:

     特点 底层是哈希表数据结构,允许使用null值和null键。该集合是线程同步的,效率较高

  3、TreeMap:

     特点 底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键值进行排序,和Set很像,

       其实,Set集合的底层就是使用了Map集合。

 两种获取集合元素的方法

  重点说一下获取方法中的两个:keySet()entrySet()方法

  1、keySet()方法获取元素

   原理:将Map集合中的所有键存入到Set集合中,因为Set集合具备迭代器,所以可以用迭代方式取出所有的键,

   再根据get方法获取每一个键对应的值。简单说就是:Map集合---->Set集合 ---->迭代器取出

import java.util.*;  
public class Temp   
{  
    public static void main(String[] args)   
    {  
        //创建Map集合,并添加元素  
        Map<Integer,String> map = new HashMap<Integer,String>();  
        map.put(2,"zhangsan");  
        map.put(6,"lisi");  
        map.put(3,"wangwu");  
        map.put(4,"heihei");  
        map.put(5,"xixi");  
        //获取map集合中的所有键的Set集合  
        Set<Integer> keySet = map.keySet();  
        //有了Set集合就可以获取其迭代器,取值  
        Iterator<Integer> it = keySet.iterator();  
        while (it.hasNext())  
        {  
            Integer i = it.next();  
            String s = map.get(i);  
            System.out.println(i + " = " + s);  
        }  
    }  
}  

  2、entrySet()方法获取元素

  原理:将Map集合中的映射关系存入到了Set集合中,而这个映射关系的数据类型是Map.Entry

       在通过迭代器将映射关系存入到Map.Entry集合中,并通过其中的getKey()和getValue()放取出键值。

/*
entrySet取出方式: 
*/  
import java.util.*;  
public class Temp  
{  
    public static void main(String[] args)   
    {  
        //创建集合,存入元素  
        Map<String,String> map = new HashMap<String,String>();  
        map.put("01","lisi1");  
        map.put("02","lisi2");  
        map.put("03","lisi3");  
        map.put("04","lisi4");  
        //获取map集合中的所有键,存入到Set集合中,  
        Set<Map.Entry<String,String>> entry = map.entrySet();  
        //通过迭代器取出map中的键值关系,迭代器接收的泛型参数应和Set接收的一致  
        Iterator<Map.Entry<String,String>> it = entry.iterator();  
        while (it.hasNext())  
        {  
            //将键值关系取出存入Map.Entry这个映射关系集合接口中  
            Map.Entry<String,String>  me = it.next();  
            //使用Map.Entry中的方法获取键和值  
            String key = me.getKey();  
            String value = me.getValue();  
            System.out.println(key + " : " + value);  
        }  
    }  
}  

  关于Map.Entry

  Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。

  为何要定义在其内部呢?

  原因:a.Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,

          而且此类关系是集合的内部事务。

        b.并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。

 Map集合的应用及扩展:

    何时使用Map集合:当量数据之间存在着映射关系的时候,就应该想到使用Map集合。

/**
 * 获取该字符串中的字母出现的次数,如:"sjokafjoilnvoaxllvkasjdfns";希望打印的结果是:a(3)c(0).....
   通过结果发现,每个字母都有对应的次数,说明字母和次数之间有映射关系。
 */
import java.util.*; 
class Temp 
{  
    public static void main(String[] args)   
    {  
        String s = "abcsjokafjoilnvoaxllvkasjdfnsde 0[fga8/-abbdc";  
        String str = LetterNum(s);  
        System.out.println(str);  
    }  
  
    public static String LetterNum(String str)  
    {  
        //将字符串转换成字符数组,因为对每个字母进行操作  
        char[] ch = str.toCharArray();  
        //定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMap集合  
        TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();  
        int count = 0;  
        //遍历字符数组,将每一个字母作为键去查map集合,  
        for (int i=0;i<ch.length;i++)  
        {  
            //判断集合是否含有其他非字母,是则再次循环  
            if (!(ch[i]>= 'a' && ch[i] <= 'z' || ch[i] >= 'A' && ch[i] <= 'Z'))  
                continue;  
            //取出键对应的值,不为则计数器加1,存入集合,并将计数器清零,用于下一个字母  
            Integer value = tm.get(ch[i]);  
            if (value != null)  
                count = value;  
            count++;  
            tm.put(ch[i],count);  
            count = 0;  
        }  
        //创建字符串容器,存入取出的键值即按顺序排列的字符串  
        StringBuilder sb = new StringBuilder();  
        //迭代器取出相应键值,并存入字符串容器  
        Iterator<Map.Entry<Character,Integer>> it = tm.entrySet().iterator();  
        while (it.hasNext())  
        {  
            Map.Entry<Character,Integer> me = it.next();  
            Character key = me.getKey();  
            Integer value = me.getValue();  
            sb.append(key + "(" + value + ")");  
        }  
        return sb.toString();  
    }  
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值